[英]Xml Serialize root attribute on List class
我有一个需要序列化/反序列化的XML,但是要使其完全按需工作却有很多困难。 我拥有的代码适用于98%的结构,但无法在根节点上序列化/反序列化属性。
样本XML;
<rootNode date="2000-01-01" time="07:00">
<detail>
<reference>12345</reference>
</detail>
</rootNode>
当前用于反序列化的类;
[XmlType("detail")]
public class Detail
{
[XmlElement("reference")]
public string Reference { get; set; }
}
[XmlRoot("rootNode")]
public class Root : List<Detail>
{
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("time")]
public string Time { get; set; }
}
从实际XML重命名的每个元素的细节在我的实现中都是重要且必要的。 如果我不继承自List<Detail>
并具有一个collection属性(假定相同类型的Details
),那么我可以获取属性,但最终得到XML,例如:
<rootNode date="2000-01-01" time="07:00">
<Details>
<detail>
<reference>12345</reference>
</detail>
</Details>
</rootNode>
但这不是我要反序列化的内容。 通过XmlArray
和XmlArrayItem
控制序列化的方式,我可以重命名集合节点和项目节点,但不能摆脱集合节点本身。 有什么建议么?
我认为您应该删除从Root到List的继承,并将Details属性添加到Root:
[XmlType("detail")]
public class Detail
{
[XmlElement("reference")]
public string Reference { get; set; }
}
[XmlRoot("rootNode")]
public class Root
{
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("time")]
public string Time { get; set; }
[XmlElement("detail")]
List<Detail> Details { get; set; }
}
[XmlType("detail")]
public class Detail
{
[XmlElement("reference")]
public string Reference { get; set; }}
}
[XmlRoot("rootNode")]
public class Root
{
[XmlAttribute("date")]
public string Date { get; set; }
[XmlAttribute("time")]
public string Time { get; set; }
[XmlElement("detail")]
public Detail detail{ get; set; }
}
或者您通过IXmlSerializable Override XML序列化方法使用“定制”序列化
这只是@Oscar在回答中提到的其他背景。
像往常一样: 倾向于继承而不是继承 。 基本上,您应该问自己: Root
-element 是否为Detail
的列表,或者是否包含一个。 如有疑问,请考虑以下事项:
您的Root
-element应该是具有某些属性的实例。 它还包含一个元素列表,即Details
。 如果您是在重写列表之后说的,则基本上是说Root
就是列表,但是我想重写该列表的工作原理(例如,您想修改Add
方法来做一些不同的事情)。 但是,在您的情况下,您要做的就是扩展列表而不是覆盖列表,不是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.