List类上的Xml序列化根特性
本文关键字:序列化 Xml List | 更新日期: 2023-09-27 18:01:45
我有一段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>
继承,并且有一个集合属性(假设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; }
}
这只是@Oscar在回答中提到的额外背景。
和往常一样:喜欢组合而不是继承。基本上,您应该问问自己,您的Root
-元素是Detail
的列表,还是有。如果有疑问,请考虑以下内容:
Root
-元素应该是一个具有某些属性的实例。它还具有一个元素列表,即Details
。如果您在覆盖列表之后,您会说Root
基本上就是一个列表,但我想重写该列表后面的工作方式(例如,您想修改Add
-方法来做一些不同的事情(。然而,在您的情况下,您只想扩展列表,而不是覆盖,不是吗?
[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的"自定义"序列化覆盖XML序列化方法