簡體   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