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>

但这并不是我想要反序列化的。通过控制它通过XmlArrayXmlArrayItem序列化的方式,我可以重命名集合节点和项节点,但不能去掉集合节点本身。有什么建议吗?

List类上的Xml序列化根特性

我认为应该删除从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序列化方法

相关文章: