簡體   English   中英

屬性未被XmlSerializer序列化

[英]attribute not being serialized by XmlSerializer

我想將類序列化為XML,為其分配XML屬性。 片段:

    [XmlType(TypeName = "classmy")]
    public class MyClass2 : List<object>
    {
        [XmlAttribute(AttributeName = "myattr")]
        public string Name { get; set; }
    }

    public class MyConst
    {
        public MyConst()
        {
            MyClass2 myClass2 = new MyClass2 { 10, "abc" };

            myClass2.Name = "nomm";

            XmlSerializer serializer = new XmlSerializer(typeof(MyClass2));
            serializer.Serialize(Console.Out, myClass2);
        }
    }

但是生成的XML看起來像這樣

<?xml version="1.0" encoding="IBM437"?>
<classmy xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <anyType xsi:type="xsd:int">10</anyType>
  <anyType xsi:type="xsd:string">abc</anyType>
</classmy>

一切都很好,唯一的例外是myClass2.Name沒有被序列化。 我期待着一些東西

<classmy myattr="nomm" [...]>[...]</classmy>

...為什么不是序列化的,它怎么可能?

不要派生List<T> ,用成員List創建類

[XmlType(TypeName = "classmy")]
public class MyClass2
{
    [XmlAttribute(AttributeName = "Items")]
    List<object> Items { get; set; } //need to change type in `<>`

    [XmlAttribute(AttributeName = "myattr")]
    public string Name { get; set; }
}

XmlSerializer以特殊方式處理List <>:

如果滿足某些要求,XmlSerializer可以處理實現IEnumerable或ICollection的類。 實現IEnumerable的類必須實現一個帶有單個參數的公共Add方法。 Add方法的參數必須與從GetEnumerator方法返回的IEnumerator.Current屬性返回的類型一致(多態)。 除了IEnumerable(例如CollectionBase)之外,實現ICollection的類必須具有公共Item索引屬性(C#中的索引器),該屬性采用整數,並且它必須具有integer類型的公共Count屬性。 傳遞給Add方法的參數必須與Item屬性返回的參數類型相同,或者是該類型的基礎之一。 對於實現ICollection的類,將從索引的Item屬性中檢索要序列化的值,而不是通過調用GetEnumerator。 另請注意,除了返回另一個集合類(實現ICollection的集合類)的公共字段之外,公共字段和屬性不會被序列化 MSDN - 滾動到XML序列化注意事項

這就是為什么它只將你的類序列化為一個對象列表,沒有你的屬性。 最好的解決方案是將List包含為類公共屬性並將其標記為XmlElement。

替代解決方案:使用數組而不是列表和XmlElement

    [XmlType(TypeName = "classmy")]
    public class MyClass2
    {
        [XmlElement(ElementName = "Items")]
        public object[] Items { get; set; }
        [XmlAttribute(AttributeName = "myattr")]
        public string Name { get; set; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM