为什么System.Xml.Serialization输出顺序更改

时间:2014-01-08 21:34:55

标签: c# xml-serialization

我刚刚在C#中选择了XML序列化。在搞清楚的过程中,我偶然发现了一个奇怪的想知道原因。

如果我使用以下代码,

[Serializable, XmlRoot("ThisIsTheRootName")]
public class Person
{
  public string FirstName;
  public string MiddleName;
  public string LastName;
  [XmlText]
  public string Text;
}

序列化时我得到了这个输出:

    <?xml version="1.0" encoding="IBM437"?>
<ThisIsTheRootName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>firstname</FirstName>
  <MiddleName>middlename</MiddleName>
  <LastName>lastname</LastName>This is some text</ThisIsTheRootName>

所有元素都按照我预期的顺序。

如果我切换到使用属性而不是字段,突然命令不是我所期望的。代码:

[Serializable, XmlRoot("ThisIsTheRootName")]
public class Person
{
  public string FirstName;
  public string MiddleName { get; set; }
  public string LastName;
  [XmlText]
  public string Text;
}

输出:

<?xml version="1.0" encoding="IBM437"?>
<ThisIsTheRootName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>firstname</FirstName>
  <LastName>lastname</LastName>This is some text<MiddleName>middlename</MiddleName></ThisIsTheRootName>


为什么订单会发生变化?我应该为此选择属性或字段吗?有关系吗?

在Windows 7 64位上使用Visual Studio 2010,C#,.NET 4.0框架。

1 个答案:

答案 0 :(得分:0)

因为默认情况下XmlSerializer首先序列化您的字段,然后是您的属性。但是,您可以使用XmlElement属性更改此行为,并使用Order属性,如下所示:

[Serializable, XmlRoot("ThisIsTheRootName")]
public class Person
{
  [XmlElement(Order = 1)]
  public string FirstName;
  [XmlElement(Order = 2)]
  public string MiddleName { get; set; }
  [XmlElement(Order = 3)]
  public string LastName;
  [XmlText]
  public string Text;
}

另外,您可能需要查看以下问题:

  1. .NET Serialization Ordering
  2. Force XML elements to match the class order when serializing
  3. Change the order of elements when serializing XML