XML序列化:当您指定至少1个Order属性时,您的类是必需的吗?

时间:2013-05-30 07:57:30

标签: c# .net xml serialization

使用以下课程:

[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));

2 个答案:

答案 0 :(得分:3)

我设法弄明白,差异确实在XmlElement订单和DataMember订单之间。在XmlEments上定义订单时,您需要所有XmlElements都有订单。

在DataMembers上定义订单时,以下规则适用:

  • 如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终位于订单中。

  • 接下来依次是当前类型的数据成员,它们没有按字母顺序设置DataMemberAttribute属性的Order属性。

  • 接下来是具有DataMemberAttribute属性集的Order属性的任何数据成员。它们首先按Order属性的值排序,然后按字母顺序排序,如果某个Order值有多个成员。可以跳过订单值。

来源:http://msdn.microsoft.com/en-us/library/ms729813.aspx

答案 1 :(得分:0)

我遇到了相同的序列化错误

顺序不一致:如果在类的成员之一上使用,则所有类粒子成员都需要'Order'属性,请在类成员'Id'上使用XmlElement,XmlAnyElement或XmlArray自定义属性显式设置'Order'< / p>

原因是我使用部分模式扩展了基于WSDL的代理类,却忘记在添加的虚拟属性上设置[XmlIgnore]:

public partical class MyWsdlProxyClass
{
   [XmlIgnore]
   public Guid Id { get; set; }
}

上面的代码中的XmlIgnore标志救了我,因为此属性实际上不是序列化XML的一部分。