List类上的Xml Serialize根属性

时间:2016-08-10 10:03:20

标签: c# xml xml-serialization

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

3 个答案:

答案 0 :(得分:2)

我认为您应该从Root移除继承到List,并将Details属性添加到R​​oot:

[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; }

}

答案 1 :(得分:1)

[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 Serialization Method

答案 2 :(得分:1)

这只是@Oscar在答案中提及的另一个背景。

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

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