使用以下课程:
[Serializable]
public class OrderedClass
{
private int field1;
private string field2;
private string field3;
[XmlElement(Order = 30)]
public string Field3
{
get { return field3; }
set { field3 = value; }
}
public int Field1
{
get { return field1; }
set { field1 = value; }
}
[XmlElement(Order = 20)]
public string Field2
{
get { return field2; }
set { field2 = value; }
}
public OrderedClass()
{
field1 = 1;
field2 = "String1";
field3 = "String2";
}
}`
如果没有在public int Field1
上设置订单,这会序列化吗?
我认为这会在幕后将其顺序设置为0,而是在尝试序列化时遇到反射错误
XmlSerializer orderedSerializer =
new XmlSerializer(typeof(OrderedClass));
答案 0 :(得分:3)
我设法弄明白,差异确实在XmlElement订单和DataMember订单之间。在XmlEments上定义订单时,您需要所有XmlElements都有订单。
在DataMembers上定义订单时,以下规则适用:
如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终位于订单中。
接下来依次是当前类型的数据成员,它们没有按字母顺序设置DataMemberAttribute属性的Order属性。
接下来是具有DataMemberAttribute属性集的Order属性的任何数据成员。它们首先按Order属性的值排序,然后按字母顺序排序,如果某个Order值有多个成员。可以跳过订单值。
答案 1 :(得分:0)
我遇到了相同的序列化错误
顺序不一致:如果在类的成员之一上使用,则所有类粒子成员都需要'Order'属性,请在类成员'Id'上使用XmlElement,XmlAnyElement或XmlArray自定义属性显式设置'Order'< / p>
原因是我使用部分模式扩展了基于WSDL的代理类,却忘记在添加的虚拟属性上设置[XmlIgnore]:
public partical class MyWsdlProxyClass
{
[XmlIgnore]
public Guid Id { get; set; }
}
上面的代码中的XmlIgnore标志救了我,因为此属性实际上不是序列化XML的一部分。