【.NET序列化和反序列化】基本篇
.Net中的序列化方法有三种:
(1) 二进制序列化(注:序列化生成的是二进制文件)
(2)SOAP 序列化(注:序列化生成的是xml文件)
(3)XML 序列化 (注:序列化生成的是xml文件)
序列化相关的两个类型:
SerializableAttribute:指示一个类是可以序列化的,缩略写法 [Serializable]。
ISerializable:使对象可以自己控制其序列化和反序列化的过程。
对比三种序列化方法:
实例演示:
创建一个序列化对象类
[Serializable] public class MyObject { /// <summary> /// 出生地 /// </summary> public string homeplace { get; set; } /// <summary> /// 出生日期 /// </summary> public DateTime birthday { get; set; } /// <summary> /// 姓名 /// </summary> public string name { get; set; } /// <summary> /// 年龄 /// </summary> public int age { get; set; } /// <summary> /// 重写了ToString()方法 /// </summary> /// <returns></returns> public override string ToString() { return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homeplace,age); } }
序列化方法:
/// <summary> /// 二进制序列化对象 /// </summary> /// <param name="obj"></param> public static void BinarySerialize(MyObject obj) { using (FileStream stream = new FileStream("c://myobject.txt", FileMode.Create, FileAccess.Write)) { BinaryFormatter formater = new BinaryFormatter(); formater.Serialize(stream, obj); Console.WriteLine("对象已经被序列化\r\n" + obj.ToString()); } } /// <summary> /// 二进制反序列化对象 /// </summary> /// <param name="obj"></param> public static void BinaryDeSerialize(string filename) { using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { BinaryFormatter formater = new BinaryFormatter(); MyObject obj = (MyObject)formater.Deserialize(stream); Console.WriteLine("对象已经被反序列化\r\n" + obj.ToString()); } } /// <summary> /// soap序列化对象 /// </summary> /// <param name="obj"></param> public static void SoapSerialize(MyObject obj) { using (FileStream stream = new FileStream("c://myobject.txt", FileMode.Create, FileAccess.Write)) { SoapFormatter formater = new SoapFormatter(); formater.Serialize(stream, obj); Console.WriteLine("对象已经被序列化\r\n" + obj.ToString()); } } /// <summary> /// soap反序列化对象 /// </summary> /// <param name="filename"></param> public static void SoapDeSerialize(string filename) { using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { SoapFormatter formater = new SoapFormatter(); MyObject obj = (MyObject)formater.Deserialize(stream); Console.WriteLine("对象已经被反序列化\r\n" + obj.ToString()); } } /// <summary> /// xml序列化对象 /// </summary> /// <param name="obj"></param> public static void XmlSerialize(MyObject obj) { using (FileStream stream = new FileStream("c://myobject.xml", FileMode.Create, FileAccess.Write)) { XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); serializer.Serialize(stream, obj); Console.WriteLine("对象已经被序列化\r\n" + obj.ToString()); } } /// <summary> /// xml反序列化对象 /// </summary> /// <param name="filename"></param> public static void XmlDeSerialize(string filename) { using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); MyObject obj = (MyObject)serializer.Deserialize(stream); Console.WriteLine("对象已经被反序列化\r\n" + obj.ToString()); } }
序列化方法调用:
static void Main(string[] args) { MyObject obj = new MyObject(); obj.name = "XXX"; obj.birthday = Convert.ToDateTime("2012-12-12"); obj.homeplace = "广东省深圳市"; obj.age = 23; Console.WriteLine("************使用BinaryFormatter进行序列化和反序列化***************"); BinarySerialize(obj); BinaryDeSerialize("c://myobject.txt"); Console.WriteLine("******************************************************************\r\n\r\n"); Console.WriteLine("************使用SoapFormatter进行序列化和反序列化*****************"); SoapSerialize(obj); SoapDeSerialize("c://myobject.txt"); Console.WriteLine("******************************************************************\r\n\r\n"); Console.WriteLine("************使用XmlFormatter进行序列化和反序列化******************"); XmlSerialize(obj); XmlDeSerialize("c://myobject.xml"); Console.WriteLine("******************************************************************\r\n\r\n"); }
运行结果: