Xml 序列化列表中的根属性 class

Xml Serialize root attribute on List class

我有一块 XML 需要 serialize/deserialize 但我很难让它完全按照需要工作。我的代码适用于 98% 的结构,但我无法在根节点上获取属性 serialized/deserialized。

样本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 控制它的序列化方式允许我重命名集合节点和项目节点,但不能删除集合节点本身。有什么建议吗?

我认为你应该删除从 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; }
}

或者您使用 "customized" 序列化和 IXmlSerializable Override XML Serialization Method

这只是@Oscar 在他的回答中提到的额外背景。

经常:favor composition over inheritance。基本上你应该问自己 Root 元素 的列表 Detail ,还是 一个.如有疑问,请考虑以下事项:

您的 Root-元素应该是具有某些属性的实例。它还 有一个 元素列表,即 Details。如果你在 覆盖 列表之后,你基本上说 Root 一个列表,但是我想 override 该列表背后的工作原理(例如,您想修改 Add 方法来做一些不同的事情)。但是,在您的情况下,您要做的就是 扩展 列表而不是 覆盖 列表,不是吗?