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
我得到 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
.
XmlElement