反序列化(Deserialization) :與序列化相對(duì)的是反序列化,將其它數(shù)據(jù)格式轉(zhuǎn)換為對(duì)象的過程。
作用:將對(duì)象中的數(shù)據(jù)轉(zhuǎn)換成其它文件,方便信息的存儲(chǔ)與交換。
.NET框架提供了三種序列化的方式: 1、使用BinaryFormatter進(jìn)行序列化,類中的所有成員變量(甚至標(biāo)記為 PRivate 的變量)都將被序列化。 2、使用SoapFormatter進(jìn)行序列化,類中的所有成員變量(甚至標(biāo)記為 private 的變量)都將被序列化。 3、使用xmlSerializer進(jìn)行序列化,只有公共字段被序列化。 第一種方式提供了一個(gè)簡(jiǎn)單的二進(jìn)制數(shù)據(jù)流以及某些附加的類型信息。而第二種將數(shù)據(jù)流格式化為XML存儲(chǔ)。第三種其實(shí)和第二種差不多也是XML的格式存儲(chǔ),只不過比第二種的XML格式要簡(jiǎn)化很多(去掉了SOAP特有的額外信息)。 1,2必須使用[Serializable]屬性將類標(biāo)志為可序列化的,3可以不用對(duì)類用[Serializable]屬性進(jìn)行標(biāo)記 1,2可以序列化類中的所有成員變量(私有的,公有的),3只可以序列化類中的公有成員變量。 如果某個(gè)類的元素不想被序列化, 1,2可以使用[NonSerialized]屬性來(lái)標(biāo)志,3、可以使用[XmlIgnore]來(lái)標(biāo)志。
1.二進(jìn)制流序列化及反序列化
1.1序列化
using System;using System.Collections.Generic;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace xuliehua{ //用[Serializable]標(biāo)記要序列化的類型 [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="影流"}, }; //創(chuàng)建一個(gè)文件流 using (FileStream fs = new FileStream(@"E:/person.txt", FileMode.OpenOrCreate)) { //創(chuàng)建二進(jìn)制序列化器 BinaryFormatter bf = new BinaryFormatter(); //序列化 bf.Serialize(fs, lp); } } }}查看序列化后的文件:
1.2反序列化
反序列化需要引用原來(lái)的類所在的程序集,如圖所示:
using System;using System.Collections.Generic;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace fanxuliehua{ class Program { static void Main(string[] args) { //創(chuàng)建一個(gè)文件流 using (FileStream fs = new FileStream(@"E:/person.txt", FileMode.Open)) { //創(chuàng)建二進(jìn)制序列化器 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)); } } }}結(jié)果如圖所示:
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="戰(zhàn)士",age=191,adress="艾歐尼亞"}, new Person(){name="術(shù)士",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反序列化
同樣,也需要引用原來(lái)的類所在的程序集。
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)); } } }}結(jié)果如圖所示:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注