序列化2个同名不同属性的属性
Serialize 2 properties with the same name but different attributes
我在尝试序列化 class 时遇到错误。 xml 架构由第三方定义,我无法更改它。
xml 看起来像这样(顺便说一句,只有片段):
<order>
<date type="received-date">20160810</date>
<date type="required-date">20160810</date>
<reference type="cust-order-no">CCCC</reference>
<reference type="an-2">AAAA</reference>
<reference type="an-3">BBBB</reference>
<order>
我已经为我的订单日期class定义了以下内容
[Serializable]
public class OrderDate
{
public enum OrderDateTypeEnum
{
[Description("entered-date")]
EnteredDate,
[Description("received-date")]
ReceivedDate,
[Description("required-date")]
RequiredDate
}
private OrderDateTypeEnum _typeEnum;
[XmlIgnore]
public OrderDateTypeEnum TypeEnum
{
get { return this._typeEnum; }
set
{
this._typeEnum = value;
this.Type = this._typeEnum.GetDescription();
}
}
[XmlAttribute("type")]
public string Type { get; set; }
[XmlText]
public string Name { get; set; }
}
顺序class定义为:
[Serializable]
public class Order
{
[XmlElement("date")]
public OrderDate EnteredDate { get; set; }
[XmlElement("date")]
public OrderDate ReceivedDate { get; set; }
[XmlElement("date")]
public OrderDate RequiredDate { get; set; }
}
但是当我序列化这个时,我得到一个错误:
The XML element 'date' from namespace '' is already present in the current
scope. Use XML attributes to specify another XML name or namespace for the
element.
当我删除 [XmlElement("date")]
时,它可以工作,但我的 xml 没有按我需要的方式格式化。
当我接触到它时,我会遇到与参考完全相同的问题。
如何避免这个问题?
如果不自己实现 IXmlSerializable
,您将无法执行此操作并映射到您定义的 Order
。您可以做的是使用单个 List<OrderDate>
属性:
[XmlRoot("order")]
public class Order
{
[XmlElement("date")]
public List<OrderDate> Dates { get; set; }
}
有关工作演示,请参阅 this fiddle。如果您愿意,可以添加各种(忽略的)属性来查询每种类型的日期。
顺便说一句,[Serializable]
属性与 XmlSerializer
无关,可以删除。
我在尝试序列化 class 时遇到错误。 xml 架构由第三方定义,我无法更改它。
xml 看起来像这样(顺便说一句,只有片段):
<order>
<date type="received-date">20160810</date>
<date type="required-date">20160810</date>
<reference type="cust-order-no">CCCC</reference>
<reference type="an-2">AAAA</reference>
<reference type="an-3">BBBB</reference>
<order>
我已经为我的订单日期class定义了以下内容
[Serializable]
public class OrderDate
{
public enum OrderDateTypeEnum
{
[Description("entered-date")]
EnteredDate,
[Description("received-date")]
ReceivedDate,
[Description("required-date")]
RequiredDate
}
private OrderDateTypeEnum _typeEnum;
[XmlIgnore]
public OrderDateTypeEnum TypeEnum
{
get { return this._typeEnum; }
set
{
this._typeEnum = value;
this.Type = this._typeEnum.GetDescription();
}
}
[XmlAttribute("type")]
public string Type { get; set; }
[XmlText]
public string Name { get; set; }
}
顺序class定义为:
[Serializable]
public class Order
{
[XmlElement("date")]
public OrderDate EnteredDate { get; set; }
[XmlElement("date")]
public OrderDate ReceivedDate { get; set; }
[XmlElement("date")]
public OrderDate RequiredDate { get; set; }
}
但是当我序列化这个时,我得到一个错误:
The XML element 'date' from namespace '' is already present in the current
scope. Use XML attributes to specify another XML name or namespace for the
element.
当我删除 [XmlElement("date")]
时,它可以工作,但我的 xml 没有按我需要的方式格式化。
当我接触到它时,我会遇到与参考完全相同的问题。
如何避免这个问题?
如果不自己实现 IXmlSerializable
,您将无法执行此操作并映射到您定义的 Order
。您可以做的是使用单个 List<OrderDate>
属性:
[XmlRoot("order")]
public class Order
{
[XmlElement("date")]
public List<OrderDate> Dates { get; set; }
}
有关工作演示,请参阅 this fiddle。如果您愿意,可以添加各种(忽略的)属性来查询每种类型的日期。
顺便说一句,[Serializable]
属性与 XmlSerializer
无关,可以删除。