要把一个复杂对象弄成一个文件发给别人的话,自己定义存储格式要费很大的周折,不过微软早就帮咱们把算法写好了,只要套用一个函数就OK了!越来越觉得C#便捷了!
序列化:
1 //1.序列化: 2 //给所有要序列化的类、父类、成员的类添加[Serializable]特性 3 //创建写的文件流 4 FileStream fs = File.Create("person.bin"); 5 using (fs) 6 { 7 //创建一个序列化器 8 BinaryFormatter bf = new BinaryFormatter(); 9 //执行序列化10 bf.Serialize(fs, p); 11 } 12 13 //2.反序列化: 14 //引用被序列化的成员的类所在的程序集 15 //创建读文件流16 FileStream fs1 = File.OpenRead("person.bin"); 17 Person p1; 18 using (fs1) 19 { 20 //创建序列化器21 BinaryFormatter bf1 = new BinaryFormatter(); 22 //执行反序列化23 Object obj = bf1.Deserialize(fs1); 24 p1 = (Person)obj; 25 }
XML序列化与上面的类似:
1 //XML序列化要添加的特性是[XmlIgnoreAttribute]。不能序列化私有字段。 2 3 //1.序列化 4 XmlSerializer xml = new XmlSerializer(typeof(Person)); 5 using (FileStream fs = File.OpenWritePersonxml")) 6 { 7 xml.Serialize(fs, list); 8 } 9 10 //2.反序列化11 XmlSerializer xmlSerializer = new XmlSerializer(typeof(类Person型)); 12 using (FileStream fs = File.OpenRead(Person.xml"))13 { 14 Person p = (Person)xmlSerializer.Deserialize(fs); 15 }
序列化的典型应用就是深拷贝:
1 public Person Copy() 2 { 3 //定义序列化器 4 BinaryFormatter bf = new BinaryFormatter(); 5 //定义内存流 6 MemoryStream ms = new MemoryStream(); 7 using (ms) 8 { 9 //将对象序列化到流中。 10 bf.Serialize(ms, this); 11 //让流的指针再回到初始位置12 ms.Position = 0; 13 //反序列化到新对象里14 Person p = (Person)bf.Deserialize(ms); 15 return p; 16 } 17 }