XML 序列化程序无法正确反序列化数组

XML serializer not able to Deserialize array correctly

我得到 XML 格式如下:

<Order>
    <OrderData>
        <OfferOrder></OfferOrder>
        <OfferOrder></OfferOrder>       
    </OrderData>
</Order>

现在,当我反序列化包含 XML 的字符串 orderxml 时,它不会将 <OfferOrder> 填充到我的 OrderData 对象中。

XmlSerializer xmlserializer = new XmlSerializer((typeof(Order)));
using (TextReader reader = new StringReader(orderxml))
{
    order = (Order)xmlserializer.Deserialize(reader);
}

:

public partial class Order
{
    private OrderOrderData orderDataField;

    public OrderOrderData OrderData
    {
        get
        {
            return this.orderDataField;
        }
        set
        {
            this.orderDataField = value;
        }
    }
}

public partial class OrderOrderData
{
    private OrderOrderDataOfferOrder[] offerOrderField;

    public OrderOrderDataOfferOrder[] OfferOrder
    {
        get
        {
            return this.offerOrderField;
        }
        set
        {
            this.offerOrderField = value;
        }
    }
}

我的类有问题吗?

您的代码中存在一些问题。首先,您可以将属性设置为 auto-implemented 属性,即省略私有 backing-fields 并改为:

public MyType MyProperty { get; set; }

其次,您必须向序列化程序提供 Xml 中的标签名称。在您的情况下,xml 中的名称与 class-structure 中的名称相同,因此您也可以省略名称。然而只是为了完整性:

public class Order
{
    [XmlElement("OrderData")
    public OrderOrderData OrderData { get; set; }
}

public class OrderOrderData
{
    [XmlElement("OfferOrder")
    public OrderOrderDataOfferOrder[] OfferOrder { get; set; }
}

它对您不起作用的原因是数组通常使用嵌套元素序列化,在您的情况下其名称为 OfferOrders。在那个标签中,你有数组元素。通常它不希望有进一步的嵌套,你想要的是将数组的元素直接展平到你的实际 data-class 中。为此,在我的代码 OfferOrder.

中,使用 元素 的名称在 array-declaration 前面添加一个 XmlElement