对象序列化
为什么要序列化?
对象序列化,用于把数据序列化,按特定格式存储。把复杂的对象转换流,方便我们的存储和交流。例如:
定义两个类
public class Person { public int Age { get; set; } public string Name { get; set; } private string _gender; public string Gender { get { return _gender; } set { _gender = value; } } public void SayHi() { } public Car CarName { get; set; } } public class Car { public string Name { get; set; } public Car(string name) { this.Name = name; } }
Person p=new Person();
p.Name="婷婷";p.Age=18;p.CarName=new Car("BMW");
一、Json序列化
using System.Web.Script.Serialization;
JavaScriptSerializer json = new JavaScriptSerializer();// string p1= json.Serialize(p); // 直接调用JavaScriptSerializer的Serialize方法
Console.WriteLine("json serialize============================="); Console.WriteLine(p1);
二、xml序列化
Console.WriteLine("xml serialize============================"); XmlSerializer xml = new XmlSerializer(typeof(Person)); using (FileStream fs=new FileStream("serialize.xml",FileMode.Create,FileAccess.Write)) {//使用文件流存入xml文件 xml.Serialize(fs, p);//直接调用Serialize方法,和json序列步骤差不多。 }
三、二进制序列化
Console.WriteLine("binary serialize========================"); BinaryFormatter binary = new BinaryFormatter(); //使用 binaryFormatter using (FileStream fs=new FileStream("binary.bin",FileMode.Create,FileAccess.Write)) //存入.bin文件 { binary.Serialize(fs,p); }
1.被序列化的类型必须标记为可序列化的 (在类型定义前加[serializable])
[Serializable] public class Person { }
2.被序列化的类型的所有父类也必须标记为可序列化的(object也标记了)
3.不想让属性参与序列化,在前面 加[NonSerialized](不能用自动属性)
[NonSerialized] private string _gender; public string Gender { get { return _gender; } set { _gender = value; } }
二进制反序列化:
// 必须获取被序列化对象的类型所在的程序集。因为只有数据,没有方法、接口、继承相关信息。 BinaryFormatter bf = new BinaryFormatter(); using (FileStream fs=new FileStream("binary.bin",FileMode.Open)) { object obj= bf.Deserialize(fs); Person per = obj as Person; Console.WriteLine(per.Age); Console.WriteLine(per.Name); Console.WriteLine(per.Gender); Console.ReadKey(); }
注意:
1、要序列化的类型必须标记为[Serializable]
2、该类型的父类也必须标记为[Serializable]
3、该类型中的所有成员的类型也必须标记为[Serializable]
4、序列化只是改变了存储格式,并没有改变存储的内容。而且只序列化数据(字段)
5、不建议使用自动属性。(每次生成的字段可能不一样,影响反序列化)