我刚刚在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框架。
答案 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;
}
另外,您可能需要查看以下问题: