序列化是將對象轉換成字節流的過程,反序列化是把字節流轉換成對象的過程。對象一旦被序列化,就可以把對象狀態保存到硬盤的某個位置,甚至還可以通過網絡發送給另外一臺機器上運行的進程。本篇主要包括:
● 使用BinaryFormatter類進行序列化和反序列化
● 使用ISerializable接口自定義序列化過程
● 使用xmlSerializer類進行序列化和反序列化
□ 使用BinaryFormatter類進行序列化和反序列化
首先把需要序列化的類打上[Serializable]特性,如果某個字段不需要被序列化,就打上[NonSerialized]特性。
[Serializable]public class Meeting{public string _name;[NonSerialized]public string _location;public Meeting(string name, string location){this._name = name;this._location = location;}}
對象序列化后需要一個載體文件,以下的Meeting.binary文件用來存儲對象的狀態。
static void Main(string[] args){Meeting m1 = new Meeting("年終總結","青島");Meeting m2;//先序列化SerializedWithBinaryFormatter(m1,"Meeting.binary");m2 = (Meeting) DeserializeWithBinaryFormatter("Meeting.binary");Console.WriteLine(m2._name);Console.WriteLine(m2._location ?? "_location字段沒有被序列化");Console.ReadKey();}//序列化static void SerializedWithBinaryFormatter(object obj, string fileName){//打開文件寫成流Stream streamOut = File.OpenWrite(fileName);BinaryFormatter formatter = new BinaryFormatter();//把對象序列化到流中formatter.Serialize(streamOut, obj);//關閉流streamOut.Close();}//反序列化static object DeserializeWithBinaryFormatter(string fileName){//打開文件讀成流Stream streamIn = File.OpenRead(fileName);BinaryFormatter formatter = new BinaryFormatter();object obj = formatter.Deserialize(streamIn);streamIn.Close();return obj;}
Meeting.binary文件在bin/debug文件夾中。
□ 使用ISerializable接口自定義序列化過程
如果想對序列化的過程有更多的控制,應該使用ISerializable接口,通過它的GetObjectData方法可以改變對象的字段值。
[Serializable]public class Location : ISerializable{public int x;public int y;public string name;public Location(int x, int y, string name){this.x = x;this.y = y;this.name = name;}PRotected Location(SerializationInfo info, StreamingContext context){x = info.GetInt32("i");y = info.GetInt32("j");name = info.GetString("k");}public void GetObjectData(SerializationInfo info, StreamingContext context){info.AddValue("i", x + 1);info.AddValue("j", y + 1);info.AddValue("k", name + "HELLO");}}
以上,不僅要實現接口方法GetObjectData,還需要提供對象的重載構造函數,從SerializationInfo實例中獲取值。
在客戶端:
Location loc1 = new Location(1,2,"qingdao");Location loc2;//序列化SerializedWithBinaryFormatter(loc1, "Location.binary");loc2 = (Location) DeserializeWithBinaryFormatter("Location.binary");Console.WriteLine(loc2.x);Console.WriteLine(loc2.y);Console.WriteLine(loc2.name);Console.ReadKey();
以上,使用BinaryFormatter類進行序列化和反序列化,存儲的文件格式是二進制的,例如,打開Meeting.binary文件,我們看到:

有時候,我們希望文件的格式是xml。
□ 使用XmlSerializer類進行序列化和反序列化
XmlSerializer類進行序列化的存儲文件是xml格式。用XmlSerializer類進行序列化的類不需要打上[Serializable]特性。
public class Car{[XmlAttribute(AttributeName = "model")]public string type;public string code;[XmlIgnore]public int age;[XmlElement(ElementName = "mileage")]public int miles;public Status status;public enum Status{[XmlEnum("使用中")]Normal,[XmlEnum("修復中")]NotUse,[XmlEnum("不再使用")]Deleted}}
在客戶端:
//打開寫進流Stream streamOut = File.OpenWrite("Car.xml");System.Xml.Serialization.XmlSerializer x = new XmlSerializer(car1.GetType());//序列化到流中x.Serialize(streamOut, car1);streamOut.Close();//打開讀流Stream streamIn = File.OpenRead("Car.xml");//反序列化Car car2 = (Car) x.Deserialize(streamIn);Console.WriteLine(car2.type);Console.WriteLine(car2.code);Console.WriteLine(car2.miles);Console.WriteLine(car2.status);Console.ReadKey();
運行,打開bin/debug中的Car.xml文件如下:
<?xml version="1.0"?><Car xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" model="sedan"><code>001</code><mileage>1000</mileage><status>使用中</status></Car>
○ 類名Car成了xml的根節點
○ 打上[XmlAttribute(AttributeName = "model")]特性的字段變成了根節點的屬性,AttributeName為屬性別名
○ 枚舉項可打上[XmlEnum("使用中")]特性
如果一個類中包含集合屬性,比如以下的Department類包含一個類型List<Employee>的集合屬性Employees。
public class Department{public Department(){Employees = new List<Employee>();}public string Name { get; set; }[XmlArray("Staff")]public List<Employee> Employees { get; set; }}public class Employee{public string Name { get; set; }public Employee(){}public Employee(string name){Name = name;}}
在客戶端:
class Program{static void Main(string[] args){var department = new Department();department.Name = "銷售部";department.Employees.Add(new Employee("張三"));department.Employees.Add(new Employee("李四"));XmlSerializer serializer = new XmlSerializer(department.GetType());//打開寫進流Stream streamOut = File.OpenWrite("Department.xml");serializer.Serialize(streamOut, department);streamOut.Close();}}
查看bin/debug中的Department.xml文件。
<?xml version="1.0"?><Department xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Name>銷售部</Name><Staff><Employee><Name>張三</Name></Employee><Employee><Name>李四</Name></Employee></Staff></Department>
總結:
1、使用BinaryFormatter類序列化到二進制文件
2、使用XmlSerializer類序列化到xml文件
3、使用ISerializable接口自定義序列化過程
新聞熱點
疑難解答