1.首先解释一下名次含义:
序列化将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
反序列化与之相反将可存储或可传输的形式转换为对象的状态信息。这里不再多说
直接上代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NewXml
{
/// <summary>
/// Xml序列化与反序列化
/// </summary>
public class XmlUtil
{
#region 反序列化
/// <summary>
/// Xml反序列化成T
/// </summary>
/// <param name="type">类型</param>
/// <param name="xml">XML字符串</param>
/// <returns></returns>
public static T XmlDeserialize<T>(string xml) where T:class,new()
{
try
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmldes = new XmlSerializer(typeof(T));
return xmldes.Deserialize(sr) as T;
}
}
catch (Exception)
{
return default(T);
}
}
/// <summary>
/// Xml Stream反序列化成T
/// </summary>
/// <param name="type"></param>
/// <param name="xml"></param>
/// <returns></returns>
public static T XmlDeserialize<T>(Stream stream) where T:class,new()
{
try
{
XmlSerializer xmldes = new XmlSerializer(typeof(T));
return xmldes.Deserialize(stream) as T;
}
catch
{
return default(T);
}
}
#endregion
#region 序列化
/// <summary>
/// object序列化成Xml字符串
/// </summary>
/// <param name="type">类型</param>
/// <param name="obj">对象</param>
/// <returns></returns>
public static string XmlSerializer(object t)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(t.GetType());
try
{
//序列化对象
xml.Serialize(Stream, t);
}
catch (InvalidOperationException)
{
throw;
}
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
return str;
}
#endregion
}
}
2.使用方法:
List<Student> stu1 = new List<Student>
{
new Student{Name = "okbase", Age = 10},
new Student{Name = "张三", Age = 15},
new Student{Name = "李四", Age = 20},
};
string xml = XmlUtil.XmlSerializer(stu1);
Console.WriteLine(xml);
stu1 = XmlUtil.XmlDeserialize<List<Student>>(xml);
foreach (var stu in stu1)
{
Console.WriteLine(stu.Name);
}
普通对象,集合,datatable等均可以使用进行序列化,反序列化。
DataTable序列化:
DataTable dt = new DataTable("mytable"); // 必须指明DataTable名称
dt.Columns.Add("Dosage", typeof(int));
dt.Columns.Add("Drug", typeof(string));
dt.Columns.Add("Patient", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
// 添加行
dt.Rows.Add(25, "Indocin", "David", DateTime.Now);
dt.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
dt.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
dt.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
dt.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
// 序列化
string xml = XmlUtil.XmlSerializer(dt);
Console.Write(xml);