2

使用以下类:

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

4

2 回答 2

5

我设法弄清楚了,XmlElement 顺序和 DataMember 顺序之间确实存在差异。在 XmlElements 上定义 Order 时,您需要所有 XmlElements 都有一个顺序。

在 DataMembers 上定义顺序时,适用以下规则:

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

  • 接下来是当前类型的不具有 DataMemberAttribute 属性集的 Order 属性的数据成员,按字母顺序排列。

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

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

于 2013-05-30T08:30:53.280 回答
2

我有同样的序列化错误

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

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

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

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

于 2019-01-26T10:39:51.407 回答