c#中的序列化与反序列化
直接上代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace SerilizeLearn002 { //二进制序列化 [Serializable] public class Person { private string _name; private bool _sex; public Person(string name, bool sex) { this._name = name; this._sex = sex; } public override string ToString() { return "姓名:" + this._name + "性别:" + (this._sex ? "男" : "女"); } } [Serializable] public class Programmer : Person { private string _language; public Programmer(string name, bool sex, string language) : base(name, sex) { this._language = language; } public override string ToString() { return base.ToString() + "编程语言:" + this._language; } } class Program { static void Main(string[] args) { //创建programer 列表; List<Programmer> list = new List<Programmer>(); list.Add(new Programmer("jack",true,"c#")); list.Add(new Programmer("tom",true,"c++")); list.Add(new Programmer("frank",true,"java")); //使用二进制序列化对象; string fileName = @"d:Programmer.dat"; Stream fsStream = new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite); BinaryFormatter binFormat = new BinaryFormatter(); //二进制序列化器; binFormat.Serialize(fsStream,list); //然后我们再把他给反序列化出来滴呀; list.Clear(); //清空列表信息滴呀; fsStream.Position = 0; //重置流位置; list = (List<Programmer>)binFormat.Deserialize(fsStream); foreach (Programmer p in list) { Console.WriteLine(p); } fsStream.Close(); //释放非托管资源; Console.ReadLine(); } } }
打开文件(记事本)虽然出现了乱码,单我们还是能够看到,序列化之后,它保存了版本等信息。
总结:
使用二进制序列化,必须为每一个要序列化的的类和其关联的类加上[Serializable]特性,对类中不需要序列化的成员可以使用[NonSerialized]特性。
二进制序列化对象时,能序列化类的所有成员(包括私有的),且不需要类有无参数的构造方法。
使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。
所以反序列化时的运行环境要与序列化时的运行环境要相同,否者可能会无法反序列化成功。(只是可能)