序列化和反序列化
来源:互联网 发布:java短信验证码通道 编辑:程序博客网 时间:2024/06/05 19:21
//实例序列化的类[Serializable] public class Person { private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { age = value; } } private char gender; public char Gender { get { return gender; } set { gender = value; } } public Person(string name,int age,char gender) { this.name = name; this.age = age; this.gender = gender; } } static void Main(string[] args) { //需要的条件:FileStream、序列化对象(对象或者集合)、BinaryFormatter或者XmlSerializer、对于类,还要在其顶部加上[Serializable]标记。 //序列化的是一个对象数组或者像List集合这种形式的(不要序列化字符串,没有意义),序列化的对象是什么类型,反序列化的时候,就用什么类型来接受。 //优点:减少转化操作(直接将原对象序列化以二进制流的形式或者XML的形式存储,用的时候,再反序列化即可得到),传输方便 //对于类,要能使其实例可以序列化,必须保证其自己及成员、父类都有[Serializable]标记 //对象数组序列化时,无参构造函数也不能少 //如果用XML序列化,并要观看最后序列化结果,对象的属性不能少 //1、BinaryFormatter序列化 BinaryFormatter bf = new BinaryFormatter(); List<Person> ps = new List<Person>(); Person[] p = { new Person("Jason", 23, 'M'), new Person("Bill", 24, 'M'), new Person("Nina", 24, 'F') }; ps.AddRange(p); //创建文件流 using (FileStream fs = new FileStream(@"F:\1.txt", FileMode.Create, FileAccess.Write)) { //将对象数组序列化并保存到指定的文件中 F\:1.txt bf.Serialize(fs, ps); } //反序列化 using (FileStream fs = new FileStream(@"F:\1.txt", FileMode.Open, FileAccess.Read)) { //进行反序列化(并且要用前面被序列化的对象的类型接受反序列化的结果) List<Person> lsPs = (List<Person>)bf.Deserialize(fs); foreach (Person p in lsPs) { //得到反序列化后,所有对象的Name值 Console.WriteLine(p.Name); } } Console.ReadKey(); //2、XML序列化 List<Person> ps = new List<Person>(); Person[] p = { new Person("Jason", 23, 'M'), new Person("Bill", 24, 'M'), new Person("Nina", 24, 'F') }; ps.AddRange(p); using (FileStream fs = new FileStream(@"F:\1.txt", FileMode.Create, FileAccess.Write)) { //在进行XML序列化的时候,在类中一定要有无参数的构造方法(要使用typeof获得对象类型) XmlSerializer xml = new XmlSerializer(typeof(List<Person>)); xml.Serialize(fs, ps); } //XML反序列化 using (FileStream fs = new FileStream(@"F:\1.txt", FileMode.Open, FileAccess.Read)) { XmlSerializer xml = new XmlSerializer(typeof(List<Person>)); List<Person> lsPs = (List<Person>)xml.Deserialize(fs); foreach (Person p in lsPs) { Console.WriteLine(p.Name); } } }