繁体   English   中英

Xml在List类上序列化根属性

[英]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>

但这不是我要反序列化的内容。 通过XmlArrayXmlArrayItem控制序列化的方式,我可以重命名集合节点和项目节点,但不能摆脱集合节点本身。 有什么建议么?

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM