介绍
本文讨论了XML格式的对象序列化以及将XML文件反序列化回对象。序列化是一个过程,通过该过程,对象的状态以某种串行数据格式转换,例如XML或二进制格式。另一方面,反序列化用于将数据的字节(例如XML或二进制数据)转换为对象类型。序列化是将对象转换为易于传输的形式的过程。例如,您可以使用客户端和服务器之间的HTTP序列化对象并通过Internet传输它。另一方面,反序列化从流中重建对象。XML序列化导致强类型类具有public
属性和字段,这些属性和字段将转换为串行格式(在本例中为XML)以进行存储或传输。
让我们从一个基本的例子开始。这是一个需要序列化的简单类:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDetails
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">private</span> <span style="color:#0000ff">string</span> PoAddress { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
} </span>
创建序列化类时应注意以下几点:
- XML序列化仅序列化
public
字段和属性。 - XML序列化不包括任何类型信息。
- 我们需要一个默认/非参数化的构造函数来序列化一个对象。
ReadOnly
属性未序列化。
序列化上述类的代码:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> Main(<span style="color:#0000ff">string</span>[] args)
{
AddressDetails details = <span style="color:#0000ff">new</span> AddressDetails();
details.HouseNo = <span style="color:#000080">4</span>;
details.StreeName = <span style="color:#800080">"</span><span style="color:#800080">Rohini"</span>;
details.City = <span style="color:#800080">"</span><span style="color:#800080">Delhi"</span>;
Serialize(details);
}
<span style="color:#0000ff">static</span> <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Serialize(AddressDetails details)
{
XmlSerializer serializer = <span style="color:#0000ff">new</span> XmlSerializer(<span style="color:#0000ff">typeof</span>(AddressDetails));
<span style="color:#0000ff">using</span> (TextWriter writer = <span style="color:#0000ff">new</span> StreamWriter(<span style="color:#800080">@"</span><span style="color:#800080">C:\Xml.xml"</span>))
{
serializer<em>.Serialize</em>(writer, details);
}
}</span>
XmlSerializer
(位于System.Xml.Serialization
命名空间中)类用于序列化和反序列化。Serialize
调用类方法。由于我们必须在文件中序列化,因此我们创建了一个“ TextWriter
”。自从TextWriter
实现以来IDisposable
,我们使用了using
所以我们不需要关闭编写器。
序列化后的输出是:
隐藏 复制代码
<span style="color:#000000"><span style="color:#808080"><?</span><span style="color:#808080">xml</span> <span style="color:#808080">version</span><span style="color:#0000ff">="</span><span style="color:#0000ff">1.0"</span> <span style="color:#808080">encoding</span><span style="color:#0000ff">="</span><span style="color:#0000ff">utf-8"</span><span style="color:#808080">?</span><span style="color:#808080">></span> </span>
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDetails</span><span style="color:#0000ff">></span></span>
这里,在XML中,我们可以看到Head
创建的XML的标记与类名的标记相同,并且子标记名称与类中的属性相同AddressDetails
。每个public
属性都以Tags
创建的XML 格式显示。我们在这里可以看到,这里只public
显示字段。
XML序列化和属性
序列化期间可用的一些常见属性包括:
XmlAttribute
:此成员将序列化为XML属性。XmlElement
:该字段将序列化为XML元素。XmlIgnore
:序列化期间将忽略字段。XmlRoot
:表示XML文档的根元素。
使用XmlElement
此外,如果我们需要Tag
在类属性中使用不同的XML名称Name
。我们可以XmlElement
在类结构中引入属性。
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDetails
{
<em>[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Number"</span>)]</em>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Street"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">CityName"</span>)]
}</span>
[XmlElement("Number")]
指定HouseNo
将使用Number
XML文件中的标记名“ ” 序列化该属性。它有助于我们在XML Tag
名称和类属性名称之间进行映射。string
下面给出了带有Custom标记名称的结果XML :
隐藏 复制代码
<span style="color:#000000"><AddressDetails>
<em><Number>4<span style="color:#0000ff"></</span><span style="color:#800000">Number</span><span style="color:#0000ff">></span></em>
<Street>Rohini<span style="color:#0000ff"></</span><span style="color:#800000">Street</span><span style="color:#0000ff">></span>
<CityName>Delhi<span style="color:#0000ff"></</span><span style="color:#800000">CityName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"></</span><span style="color:#800000">AddressDetails</span><span style="color:#0000ff">></span></span>
使用XmlAttribute
如果我们希望属性HouseNo
应该作为Tag 的属性出现AddressDetails
,那么我们应该使用XmlAttribute
。XmlAttribute
序列化object
属性作为父标记的属性。以下代码说明了该功能:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddresssDetails
{
[XmlAttribute](<span style="color:#800080">"</span><span style="color:#800080">Number"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Street"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">CityName"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City {<span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>;}
}</span>
代码的XML序列化输出将是:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">AddressDetails</span> <span style="color:#ff0000"><em>Number</em></span><em><span style="color:#0000ff">="</span><span style="color:#0000ff">4"</span></em><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Street</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/Street</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">CityName</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/CityName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDetails</span><span style="color:#0000ff">></span></span>
请注意,由于class属性HouseNo
被指定为XMLAttribute
,因此该属性是父标记的Attribute AddressDetails
。
用于XmlIgnore
默认情况下,所有public
字段和public
读/写属性都由。序列化。也就是说,每个字段或属性的值在XML文档实例中作为XML元素或XML属性保留。要覆盖此属性,请将属性应用于该属性。这将从XML中删除元素。以下代码解释了以下内容:X
mlSerializer
public
XmlIgnore
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDetails
{
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Number"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo;
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Street"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName;
<strong>[XmlIgnore]</strong>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City;
}</span>
在这里,我们可以看到该属性City
包含XmlIgnore
属性。创建的结果XML将不包含其中的City
标记。
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Number</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/Number</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Street</span><span style="color:#0000ff">></span>ABC<span style="color:#0000ff"><</span><span style="color:#800000">/Street</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDetails</span><span style="color:#0000ff">></span></span>
请注意,City
由于属性XmlIgnore
放在上面,属性未被序列化。
使用XmlRoot
每个XML都有一个root
元素。默认情况下,root
元素的名称与序列化的类的名称相同。为了给XML 的根元素提供自定义名称,我们使用XmlRoot
attribute。下面提供了此属性的实现:
隐藏 复制代码
<span style="color:#000000"><strong>[XmlRoot(<span style="color:#800080">"</span><span style="color:#800080">Root"</span>)]</strong>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDetails
{
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Number"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo;
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Street"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName;
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">CityName"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City;
} </span>
在这里,我们可以看到属性XmlRoot
放在了AddressDetails
类上。现在,它将覆盖默认的序列化行为,该行为将XML标记根名称与类名称相同。XML现在将以“ Root
”作为根标记。
隐藏 复制代码
<span style="color:#000000"><strong><span style="color:#0000ff"><</span><span style="color:#800000">Root</span><span style="color:#0000ff">></span></strong>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<strong><span style="color:#0000ff"><</span><span style="color:#800000">/Root</span><span style="color:#0000ff">></span></strong> </span>
请注意,此处的根标签现在是“ Root
”而不是类名。
对象列表序列化
现在让我们尝试将AddressDetails 对象列表序列化为XML文件:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> Main(<span style="color:#0000ff">string</span>[] args)
{
List<AddressDetails> AddressList = <span style="color:#0000ff">new</span> List<AddressDetails>();
AddressDetails detail1 = <span style="color:#0000ff">new</span> AddressDetails();
detail1.HouseNo =<span style="color:#800080">"</span><span style="color:#800080">4"</span>;
detail1.StreetName = <span style="color:#800080">"</span><span style="color:#800080">ABC"</span>;
detail1.City = <span style="color:#800080">"</span><span style="color:#800080">Delhi"</span>;
AddressDetails detail2 = <span style="color:#0000ff">new</span> AddressDetails();
detail2.HouseNo =<span style="color:#800080">"</span><span style="color:#800080">3"</span>;
detail2.StreetName = <span style="color:#800080">"</span><span style="color:#800080">ABCD"</span>;
detail2.City = <span style="color:#800080">"</span><span style="color:#800080">New Delhi"</span>;
AddressList.Add(detail1);
AddressList.Add(detail2);
Serialize(AddressList);
}
<span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Serialize(List<AddressDetails> list)
{
XmlSerializer serializer = <span style="color:#0000ff">new</span> XmlSerializer(<span style="color:#0000ff">typeof</span>(List<AddressDetails>));
<span style="color:#0000ff">using</span> ( TextWriter writer = <span style="color:#0000ff">new</span> StreamWriter( <span style="color:#800080">@"</span><span style="color:#800080">C:\Xml.txt"</span>)
{
<strong>serializer.Serialize(writer, list) </strong>
}
}</span>
上述执行的XML输出将是:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">ArrayOfAddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Number</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/Number</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Street</span><span style="color:#0000ff">></span>ABC<span style="color:#0000ff"><</span><span style="color:#800000">/Street</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">CityName</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/CityName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Number</span><span style="color:#0000ff">></span>3<span style="color:#0000ff"><</span><span style="color:#800000">/Number</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Street</span><span style="color:#0000ff">></span>ABCD<span style="color:#0000ff"><</span><span style="color:#800000">/Street</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">CityName</span><span style="color:#0000ff">></span>New Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/CityName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/ArrayOfAddressDetails</span><span style="color:#0000ff">></span></span>
请注意,生成的XML会给出一个AddressDetails
对象列表。
包含其他类对象的类的序列化
如果我们有一个类结构,使得一个类包含其他类的对象,并且我们希望包含该类对象也用于序列化。我们来看看下面的例子:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> PersonalDetails
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Name { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> Age { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Address address;
}
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Address
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}</span>
这是PersonalDetails
类序列化的方式:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">PersonalDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Name</span><span style="color:#0000ff">></span>Mayank<span style="color:#0000ff"><</span><span style="color:#800000">/Name</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Age</span><span style="color:#0000ff">></span>24<span style="color:#0000ff"><</span><span style="color:#800000">/Age</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/PersonalDetails</span><span style="color:#0000ff">></span></span>
为了增加它的复杂性,让我们尝试创建以下XML结构:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">PersonalDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Name</span><span style="color:#0000ff">></span>Mayank<span style="color:#0000ff"><</span><span style="color:#800000">/Name</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Age</span><span style="color:#0000ff">></span>24<span style="color:#0000ff"><</span><span style="color:#800000">/Age</span><span style="color:#0000ff">></span>
<strong><span style="color:#0000ff"><</span><span style="color:#800000">Address</span> <span style="color:#ff0000">HouseNo</span><span style="color:#0000ff">="</span><span style="color:#0000ff">4"</span><span style="color:#0000ff">></span></strong>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/PersonalDetails</span><span style="color:#0000ff">></span></span>
请注意,这里的区别在于我们需要将“ HouseNo
”作为Address
Tag 的属性。让我们看看为了创建这个结构,将在课堂上进行哪些更改:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> PersonalDetails
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Name { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> Age { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Address address;
<span style="color:#0000ff">public</span> PersonalDetails()
{
Name = <span style="color:#800080">"</span><span style="color:#800080">Mayank"</span>;
Age = <span style="color:#000080">24</span>;
address = <span style="color:#0000ff">new</span> Address();
}
}
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Address
{
<strong>[XmlAttribute(<span style="color:#800080">"</span><span style="color:#800080">HouseNo"</span>)]</strong>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Address()
{
HouseNo = <span style="color:#000080">8</span>;
StreetName = <span style="color:#800080">"</span><span style="color:#800080">Rohini"</span>;
City = <span style="color:#800080">"</span><span style="color:#800080">Delhi"</span>;
}
}</span>
根据要求,我们希望将“ HouseNo
”作为XML属性而不是正常XMLElement
。因此,我们XmlAttribute
在财产上介绍“ ”。
让我们尝试创建以下XML结构:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">PersonalDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Name</span><span style="color:#0000ff">></span>Mayank<span style="color:#0000ff"><</span><span style="color:#800000">/Name</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Age</span><span style="color:#0000ff">></span>24<span style="color:#0000ff"><</span><span style="color:#800000">/Age</span><span style="color:#0000ff">></span>
<strong><span style="color:#0000ff"><</span><span style="color:#800000">address</span> <span style="color:#ff0000">HouseNo</span><span style="color:#0000ff">="</span><span style="color:#0000ff">8"</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/address</span><span style="color:#0000ff">></span></strong>
<span style="color:#0000ff"><</span><span style="color:#800000">/PersonalDetails</span><span style="color:#0000ff">></span></span>
这里的区别在于我们需要StreetName作为 XML节点“ address
” 的内部文本。所以为了创建这样的结构,我们有另一个属性XmlText
。这有助于我们innertext
为标签添加特定属性。
所以创建这样一个结构的代码是:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> PersonalDetails
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Name { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> Age { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Address address;
}
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Address
{
[XmlAttribute(<span style="color:#800080">"</span><span style="color:#800080">HouseNo"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<strong>[XmlText]</strong>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}</span>
在“ XmlText
”属性在这里增加了StreetName
作为InnerText
到标签“ address
”
结论
序列化是将对象转换为XML的一种非常有效的方法。这节省了大量的时间和精力。
XML的反序列化
介绍
我之前的文章XML序列化和反序列化(第1部分)讨论了将对象序列化为XML格式。在本文中,我们将讨论“ 反序列化XML ”回到对象形式。反序列化用于将数据字节(例如XML或二进制数据)转换为“ Object
”类型。可以使用反序列化将XML文件重新转换回Object。
让我们从基本的例子开始吧。以下是需要反序列化的XML文件:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff"><</span><span style="color:#800000">AddressDetails</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDetails</span><span style="color:#0000ff">></span></span>
因此,为了反序列化此XML文件,我们需要创建一个类:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Address
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}</span>
此类包含一个变量名称,该变量名称与XML标记的名称相同,默认情况下,XML标记值将映射到类中的相应变量。“ HouseNo
”类“ Address
”将自动映射到XML标签“ HouseNo
”。
现在让我们看一个将这个XML映射到类对象的基本程序:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">void</span> Main(<span style="color:#0000ff">string</span>[] args)
{
XmlSerializer deserializer = <span style="color:#0000ff">new</span> XmlSerializer(<span style="color:#0000ff">typeof</span>(Address));
TextReader reader = <span style="color:#0000ff">new</span> StreamReader(<span style="color:#800080">@"</span><span style="color:#800080">D:\myXml.xml"</span>);
<span style="color:#0000ff">object</span> obj = deserializer.Deserialize(reader);
Address XmlData = (Address)obj;
reader.Close();
}</span>
“ deserializer.Deserialize
”函数用于反序列化XML文件中的XML数据。既然我们已经将XML文件结构反序列化为对象形式,我们现在可以访问XML标记值:
隐藏 复制代码
<span style="color:#000000">Address.HouseNo
Address.StreetName
Address.City</span>
在为反序列化创建类时,应注意以下几点:
- 类变量/属性应始终声明为
public
- 我们需要使用Default / Non Parameterised构造函数来反序列化
任何没有“ Default / Non Parameterised ”构造函数的类都将导致错误,因为“ deserializer.Deserialize(reader)
”没有规定将值传递给参数化构造函数。
在上面的代码中,我们有简单的XML元素,没有子元素。让我们进一步探讨并处理一些复杂的情况,其中XML元素可能还有其他子标记:
让我们进一步复杂化并尝试“ 反序列化 ”以下“XML”:
隐藏 复制代码
<span style="color:#000000"><span style="color:#808080"><?</span><span style="color:#808080">xml</span> <span style="color:#808080">version</span><span style="color:#0000ff">="</span><span style="color:#0000ff">1.0"</span><span style="color:#808080">?</span><span style="color:#808080">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">AddressDirectory</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>1<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Pitampura<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDirectory</span><span style="color:#0000ff">></span></span>
让我们看看这里的区别。在以下XML中,我们有多个“ Address
”标记。此外,Address
标签还包含其他子标签。因此,我们需要创建我们的类,以便它可以包含多个“ Address
”标签及其子标签。让我们看看如何创建类:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDirectory
{
<strong><em>[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Address"</span>)]</em> </strong>
<span style="color:#0000ff">public</span> <strong><em>List<Address></em></strong> addressList = <span style="color:#0000ff">new</span> List<Address>();
}
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Address
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}</span>
请记住,当我们创建一个用于反序列化任何标记的类时,我们只能深入到单个级别。用简单的话来解释一下,让我举一个例子。在上面的XML中,我们有“ AddressDirectory
”选项卡。为了反序列化,我们为“ AddressDirectory
”标签创建了一个类。现在这个类可以包含以下 “ AddressDirectory
”XML标记的详细信息:
- “
AddressDirectory
”标签的属性(如果存在) - 它的Childnodes示例“
Address
”(只能访问“Address
标签”,无法向下钻取到“Address
”标签的子节点) InnerText
(如果有的话)
该类AddressDirectory
无法提取有关“ Address
”和“ Address
”标记属性的子标记的信息。为了获取有关ChildNodes
“ Address
”标签的“ ”的信息,我们需要创建另一个可以存储属性信息和childnode
信息的类(直到第一级)。
在这里,我们创建了一个AddressDirectory
映射到“XML”的根标记元素的类。根标签还包含“ Address
”标签。我们可以Address
在这里有多个“ ” 标签,因此我们Address
在“ AddressDirectory
”类中创建了一个类“ ” 列表,以便Address
可以存储多个“ ”标签信息。在这里,我们可以看到XmlElement
写完了addressList
。由于类变量的名称与XML文件中的名称不同,因此使用此属性,因此为了使用XML标记映射类变量,我们使用关键字XmlElement
。我们将在本文后面讨论这个问题。
我们将在本文中进一步看到有关此问题的更多示例。
要反序列化XML的程序将是:
隐藏 复制代码
<span style="color:#000000">XmlSerializer deserializer = <span style="color:#0000ff">new</span> XmlSerializer(<span style="color:#0000ff">typeof</span>(AddressDirectory));
TextReader reader = <span style="color:#0000ff">new</span> StreamReader(<span style="color:#800080">@"</span><span style="color:#800080">D:\myXml.xml"</span>);
<span style="color:#0000ff">object</span> obj = <strong><em>deserializer.Deserialize(reader);</em></strong>
AddressDirectory XmlData = (AddressDirectory)obj;
reader.Close();</span>
结果对象“ XmlData
”将包含类型为“ Address
” 的对象列表。我们可以访问第一个Address
标签的数据:
隐藏 复制代码
<span style="color:#000000">XmlData.addressList[<span style="color:#000080">0</span>].HouseNo;
XmlData.addressList[<span style="color:#000080">0</span>].StreetName;
XmlData.addressList[<span style="color:#000080">0</span>].City;</span>
XML可能更复杂,让我们看看以下XML文件结构及其类表示:
隐藏 复制代码
<span style="color:#000000"><span style="color:#808080"><?</span><span style="color:#808080">xml</span> <span style="color:#808080">version</span><span style="color:#0000ff">="</span><span style="color:#0000ff">1.0"</span><span style="color:#808080">?</span><span style="color:#808080">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">AddressDirectory</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Owner</span><span style="color:#0000ff">></span>Mayank<span style="color:#0000ff"><</span><span style="color:#800000">/Owner</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Age</span><span style="color:#0000ff">></span>24<span style="color:#0000ff"><</span><span style="color:#800000">/Age</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Company</span><span style="color:#0000ff">></span>BIPL<span style="color:#0000ff"><</span><span style="color:#800000">/Company</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>1<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Pitampura<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDirectory</span><span style="color:#0000ff">></span></span>
在这里,我们可以在“ AddressDirectory
”中看到一些额外的标签,如“ Owner
”,“ Age
”,“ Company
”以及“ Address
”标签列表。所以XML的类结构将是:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDirectory
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Owner { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Age { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Company { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Address"</span>)]
<span style="color:#0000ff">public</span> List<Address> addressList = <span style="color:#0000ff">new</span> List<Address>();
}
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Address
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}</span>
“ AddressDirectory
”标签的子节点存在于AddressDirectory
类中,childnode
而Address
选项卡的s 存在于address
类中。
注意:这里要注意的重要一点是,类只能包含那些作为其直接子节点的“标记值”,即AddressDirectory
只能包含有关其直接子节点的信息,如“ Owner
”,“ Company
”,“ Age
”和“ Address
”。但在这里,“ Address
”还包含更多标签。“ Address
”标签的子节点不能由类“ AddresssDirectory
”表示。因此,我们需要另一个用于“ Address
”标记的类来存储childnode
有关“ Address
”类的信息。“ Address
”类将进一步包含其直接childnode
“ HouseNo
”,“ StreetName
”,“City
Address
List
Address
“上课。
反序列化期间的XML属性
在反序列化期间可能有用的属性是:
XmlElement
XmlAttribute
XmlText
这三个属性提供映射信息。它提供有关XML标记的哪个元素将映射到类的哪个变量的信息。
观察以下XML:
隐藏 复制代码
<span style="color:#000000"><span style="color:#808080"><?</span><span style="color:#808080">xml</span> <span style="color:#808080">version</span><span style="color:#0000ff">="</span><span style="color:#0000ff">1.0"</span> <span style="color:#808080">encoding</span><span style="color:#0000ff">="</span><span style="color:#0000ff">utf-8"</span> <span style="color:#808080">?</span><span style="color:#808080">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">AddressDirectory</span> <span style="color:#ff0000">id</span><span style="color:#0000ff">="</span><span style="color:#0000ff">1"</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">DirectoryOwner</span><span style="color:#0000ff">></span>Mayank<span style="color:#0000ff"><</span><span style="color:#800000">/DirectoryOwner</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">PinCode</span><span style="color:#0000ff">></span>110085<span style="color:#0000ff"><</span><span style="color:#800000">/PinCode</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Designation</span> <span style="color:#ff0000">place</span><span style="color:#0000ff">="</span><span style="color:#0000ff">Delhi"</span><span style="color:#0000ff">></span>Engineer<span style="color:#0000ff"><</span><span style="color:#800000">/Designation</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span> <span style="color:#ff0000">AddressId</span><span style="color:#0000ff">="</span><span style="color:#0000ff">12"</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">Address</span> <span style="color:#ff0000">AddressId</span><span style="color:#0000ff">="</span><span style="color:#0000ff">13"</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">HouseNo</span><span style="color:#0000ff">></span>4<span style="color:#0000ff"><</span><span style="color:#800000">/HouseNo</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">StreetName</span><span style="color:#0000ff">></span>Rohini<span style="color:#0000ff"><</span><span style="color:#800000">/StreetName</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">City</span><span style="color:#0000ff">></span>Delhi<span style="color:#0000ff"><</span><span style="color:#800000">/City</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/Address</span><span style="color:#0000ff">></span>
<span style="color:#0000ff"><</span><span style="color:#800000">/AddressDirectory</span><span style="color:#0000ff">></span></span>
让我们观察这个XML文件的不同组件:
AddressDirectory
是XML文件的根节点AddressDirectory
包含“XmlAttribute
”作为“id
”包含值“1
”- “
AddressDirectory
”包含“XmlElement
”像DirectoryOwner
,Address
,Designation
,Address
- “
Designation
”标签包含一个“XmlAttribute
”(“place
”)和一个“XmlText
”(“Delhi
”)
所以从上面的XML中,我们可以弄清楚什么是“ XmlElement
”,“ XmlAttribute
”,“ XmlText
”。在反序列化这样复杂的XML时,我们可以拥有所有这三个组件,我们需要明确指定类变量是否存储“ Element
”,“ Attribute
”或“ XmlText
”。
让我们试着去除这个XML:
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> AddressDirectory
{
<strong><em>[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">DirectoryOwner"</span>)]</em></strong>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> DirectoryOwner { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">PinCode"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> PinCode { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Address"</span>)]
<span style="color:#0000ff">public</span> List<Address> Address { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">Designation"</span>)]
<span style="color:#0000ff">public</span> Designation designation { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
} </span>
在这里,我们将类变量映射DirectoryOwner
到DirectoryOwner
XML文件的标记。
这里观察该类AddressDirectory
包含AddressAttribute
标记的子节点。它能够深入到第一级只,也就是说,它不能检索值Attribute
的Designation
也不可以获取有关信息的childNodes的Address
标签。因此,为了提取这些信息,我们需要为Address
和创建另一个类Designation
。由于我们有多个Address
标签,因此我们有一个 Address
类列表AddressDirectory
。
让我们来探索Address
班级和Designation
班级:
隐藏 复制代码
<span style="color:#000000">public class Designation
{
<strong><em>[XmlAttribute("place")]</em></strong>
public string place { get; set; }
<strong><em>[XmlText]</em></strong>
public string JobType { get; set; }
}</span>
Designation
这里的类包含两个变量,一个用于存储innerText
,另一个用于存储标签的place
属性Designation
。
隐藏 复制代码
<span style="color:#000000"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> Addresse
{
[<strong><em>XmlAttribute(<span style="color:#800080">"</span><span style="color:#800080">AddressId"</span>)</em></strong>]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> AddressId { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">HouseNo"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> HouseNo { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">StreetName"</span>)]e
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> StreetName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">City"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> City { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}</span>
该Address
班还包含可以存储的属性和子节点的详细信息的变量Address
标签。
要反序列化XML的程序将是:
隐藏 复制代码
<span style="color:#000000">XmlSerializer deserializer = <span style="color:#0000ff">new</span> XmlSerializer(<span style="color:#0000ff">typeof</span>(AddressDirectory));
TextReader reader = <span style="color:#0000ff">new</span> StreamReader(<span style="color:#800080">@"</span><span style="color:#800080">D:\myXml.xml"</span>);
<span style="color:#0000ff">object</span> obj = <strong><em>deserializer.Deserialize(reader);</em></strong>
AddressDirectory XmlData = (AddressDirectory)obj;
reader.Close();</span>
需要牢记的一件事是,关键字XmlElement
,XmlAttribute
以及XmlText
用于映射的XML标签类变量内的信息。类变量名称可以与XML中的不同。例如:
隐藏 复制代码
<span style="color:#000000">[XmlElement(<span style="color:#800080">"</span><span style="color:#800080">HouseNo"</span>)]
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> Number { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }</span>
在这里,我们可以看到XML元素HouseNo
将被映射到类变量Number
。
结论
反序列化和序列化是将对象转换为XML的一种非常有效的方法,反之亦然。这节省了大量的时间和精力。