XML序列化和反序列化

介绍

本文讨论了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>

创建序列化类时应注意以下几点:

  1. XML序列化仅序列化public字段和属性。
  2. XML序列化不包括任何类型信息。
  3. 我们需要一个默认/非参数化的构造函数来序列化一个对象。
  4. 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将使用NumberXML文件中的标记名“ ” 序列化该属性。它有助于我们在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,那么我们应该使用XmlAttributeXmlAttribute序列化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中删除元素。以下代码解释了以下内容:XmlSerializerpublicXmlIgnore

隐藏   复制代码

<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 的根元素提供自定义名称,我们使用XmlRootattribute。下面提供了此属性的实现:

隐藏   复制代码

<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”作为AddressTag 的属性。让我们看看为了创建这个结构,将在课堂上进行哪些更改:

隐藏   复制代码

<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>

在为反序列化创建类时,应注意以下几点:

  1. 类变量/属性应始终声明为 public
  2. 我们需要使用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标记的详细信息

  1. “ AddressDirectory”标签的属性(如果存在)
  2. 它的Childnodes示例“ Address”(只能访问“ Address标签”,无法向下钻取到“ Address”标签的子节点)
  3. 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类中,childnodeAddress选项卡的s 存在于address类中。

注意:这里要注意的重要一点是,类只能包含那些作为其直接子节点的“标记值”,即AddressDirectory只能包含有关其直接子节点的信息,如“ Owner”,“ Company”,“ Age”和“ Address”。但在这里,“ Address”还包含更多标签。“ Address”标签的子节点不能由类“ AddresssDirectory”表示。因此,我们需要另一个用于“ Address”标记的类来存储childnode有关“ Address”类的信息。“ Address”类将进一步包含其直接childnode“ HouseNo”,“ StreetName”,“CityAddressListAddress“上课。

反序列化期间的XML属性

在反序列化期间可能有用的属性是:

  1. XmlElement
  2. XmlAttribute
  3. 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文件的不同组件:

  1. AddressDirectory是XML文件的根节点
  2. AddressDirectory包含“ XmlAttribute”作为“ id”包含值“ 1
  3. “ AddressDirectory”包含“ XmlElement”像DirectoryOwnerAddressDesignationAddress
  4. “ 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>

在这里,我们将类变量映射DirectoryOwnerDirectoryOwnerXML文件的标记。

这里观察该类AddressDirectory包含AddressAttribute标记的子节点。它能够深入到第一级只,也就是说,它不能检索值AttributeDesignation也不可以获取有关信息的childNodesAddress标签。因此,为了提取这些信息,我们需要为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>

需要牢记的一件事是,关键字XmlElementXmlAttribute以及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的一种非常有效的方法,反之亦然。这节省了大量的时间和精力。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值