[英]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>
但這不是我要反序列化的內容。 通過XmlArray
和XmlArrayItem
控制序列化的方式,我可以重命名集合節點和項目節點,但不能擺脫集合節點本身。 有什么建議么?
我認為您應該刪除從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; }
}
或者您通過IXmlSerializable Override XML序列化方法使用“定制”序列化
這只是@Oscar在回答中提到的其他背景。
像往常一樣: 傾向於繼承而不是繼承 。 基本上,您應該問自己: Root
-element 是否為Detail
的列表,或者是否包含一個。 如有疑問,請考慮以下事項:
您的Root
-element應該是具有某些屬性的實例。 它還包含一個元素列表,即Details
。 如果您是在重寫列表之后說的,則基本上是說Root
就是列表,但是我想重寫該列表的工作原理(例如,您想修改Add
方法來做一些不同的事情)。 但是,在您的情況下,您要做的就是擴展列表而不是覆蓋列表,不是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.