反序列化(Deserialization) :與序列化相對的是反序列化,將其它數據格式轉換為對象的過程。
作用:將對象中的數據轉換成其它文件,方便信息的存儲與交換。
.NET框架提供了三種序列化的方式: 1、使用BinaryFormatter進行序列化,類中的所有成員變量(甚至標記為 PRivate 的變量)都將被序列化。 2、使用SoapFormatter進行序列化,類中的所有成員變量(甚至標記為 private 的變量)都將被序列化。 3、使用xmlSerializer進行序列化,只有公共字段被序列化。 第一種方式提供了一個簡單的二進制數據流以及某些附加的類型信息。而第二種將數據流格式化為XML存儲。第三種其實和第二種差不多也是XML的格式存儲,只不過比第二種的XML格式要簡化很多(去掉了SOAP特有的額外信息)。 1,2必須使用[Serializable]屬性將類標志為可序列化的,3可以不用對類用[Serializable]屬性進行標記 1,2可以序列化類中的所有成員變量(私有的,公有的),3只可以序列化類中的公有成員變量。 如果某個類的元素不想被序列化, 1,2可以使用[NonSerialized]屬性來標志,3、可以使用[XmlIgnore]來標志。
1.二進制流序列化及反序列化
1.1序列化
using System;using System.Collections.Generic;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace xuliehua{ //用[Serializable]標記要序列化的類型 [Serializable] public class Person { public string name; public int age; public string adress; public void say() { Console.WriteLine("hello world"); } } class Program { static void Main(string[] args) { List<Person> lp = new List<Person>() { new Person(){name="凱",age=21,adress="影流"}, new Person(){name="劉",age=23,adress="守望之海"}, new Person(){name="陸",age=22,adress="征服之海"}, new Person(){name="星",age=19,adress="艾歐尼亞"}, new Person(){name="偉",age=24,adress="影流"}, }; //創建一個文件流 using (FileStream fs = new FileStream(@"E:/person.txt", FileMode.OpenOrCreate)) { //創建二進制序列化器 BinaryFormatter bf = new BinaryFormatter(); //序列化 bf.Serialize(fs, lp); } } }}查看序列化后的文件:
1.2反序列化
反序列化需要引用原來的類所在的程序集,如圖所示:
using System;using System.Collections.Generic;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace fanxuliehua{ class Program { static void Main(string[] args) { //創建一個文件流 using (FileStream fs = new FileStream(@"E:/person.txt", FileMode.Open)) { //創建二進制序列化器 BinaryFormatter bf = new BinaryFormatter(); //反序列化 var result = (List<xuliehua.Person>)bf.Deserialize(fs); result.ForEach(r => Console.WriteLine(r.name + "/t" + r.age + "/t" + r.adress)); } } }}結果如圖所示:
2.XML序列化及反序列化
2.1序列化
using System;using System.Collections.Generic;using System.IO;using System.Xml.Serialization;namespace xuliehua{ public class Person { public string name; public int age; public string adress; public void say() { Console.WriteLine("hello world"); } } class Program { static void Main(string[] args) { List<Person> lp = new List<Person>() { new Person(){name="薩滿",age=211,adress="影流"}, new Person(){name="獵人",age=231,adress="守望之海"}, new Person(){name="法師",age=221,adress="征服之海"}, new Person(){name="戰士",age=191,adress="艾歐尼亞"}, new Person(){name="術士",age=241,adress="影流"}, }; using (FileStream fs = new FileStream(@"E:/person.xml", FileMode.OpenOrCreate)) { XmlSerializer xs = new XmlSerializer(typeof(List<Person>)); xs.Serialize(fs, lp); } } }}查看序列化后的文件:
2.2反序列化
同樣,也需要引用原來的類所在的程序集。
using System;using System.Collections.Generic;using System.IO;using System.Xml.Serialization;namespace fanxuliehua{ class Program { static void Main(string[] args) { using (FileStream fs = new FileStream(@"E:/person.xml", FileMode.Open)) { XmlSerializer xs = new XmlSerializer(typeof(List<xuliehua.Person>)); var result = (List<xuliehua.Person>)xs.Deserialize(fs); result.ForEach(r => Console.WriteLine(r.name + "/t" + r.age + "/t" + r.adress)); } } }}結果如圖所示:
|
新聞熱點
疑難解答