时间:2017-10-15来源:本站原创作者:佚名

这篇随笔对应的.Net命名空间是System.Xml.Serialization;文中的示例代码需要引用这个命名空间。

为什么要做序列化和反序列化?

.Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。

范围:本文只介绍xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化。

看一段最简单的Xml序列化代码

classProgram{staticvoidMain(string[]args){inti=10;//声明Xml序列化对象实例serializerXmlSerializerserializer=newXmlSerializer(typeof(int));//执行序列化并将序列化结果输出到控制台serializer.Serialize(Console.Out,i);Console.Read();}}

上面代码对inti进行了序列化,并将序列化的结果输出到了控制台,输出结果如下

?xmlversion="1.0"encoding="gb"?int10/int

可以将上述序列化的xml进行反序列化,如下代码

1314staticvoidMain(string[]args){using(StringReaderrdr=newStringReader(

"?xmlversion=""1.0""encoding=""gb""?int10/int")){//声明序列化对象实例serializerXmlSerializerserializer=newXmlSerializer(typeof(int));//反序列化,并将反序列化结果值赋给变量iinti=(int)serializer.Deserialize(rdr);//输出反序列化结果Console.WriteLine("i="+i);Console.Read();}}

以上代码用最简单的方式说明了xml序列化和反序列化的过程,.Net系统类库为我们做了大量的工作,序列化和反序列化都非常简单。但是在现实中业务需求往往比较复杂,不可能只简单的序列化一个int变量,显示中我们需要对复杂类型进行可控制的序列化。

自定义对象的Xml序列化:

System.Xml.Serialization命名空间中有一系列的特性类,用来控制复杂类型序列化的控制。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。

看一个小例子,有一个自定义类Cat,Cat类有三个属性分别为Color,Saying,Speed。

1314151615namespaceUseXmlSerialization{classProgram{staticvoidMain(string[]args){//声明一个猫咪对象varc=newCat{Color="White",Speed=10,Saying="Whiteorblack,solongasthecatcancatchmice,itisagoodcat"};//序列化这个对象XmlSerializerserializer=newXmlSerializer(typeof(Cat));//将对象序列化输出到控制台serializer.Serialize(Console.Out,c);Console.Read();}}[XmlRoot("cat")]publicclassCat{//定义Color属性的序列化为cat节点的属性[XmlAttribute("color")]publicstringColor{get;set;}//要求不序列化Speed属性[XmlIgnore]publicintSpeed{get;set;}//设置Saying属性序列化为Xml子元素[XmlElement("saying")]publicstringSaying{get;set;}}}

可以使用XmlElement指定属性序列化为子节点(默认情况会序列化为子节点);或者使用XmlAttribute特性制定属性序列化为Xml节点的属性;还可以通过XmlIgnore特性修饰要求序列化程序不序列化修饰属性。

对象数组的Xml序列化:

数组的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定数组元素的Xml节点名,XmlArrayItemAttribute指定数组元素的Xml节点名。

如下代码示例:

131415161/*玉开技术博客







































白班
白癜风哪里能治好

转载请注明原文网址:http://www.helimiaopu.com/bbqb/5602.html
------分隔线----------------------------