2012-08-08 50 views
7

我想序列化一個類到XML,爲它分配一個XML屬性。摘錄:屬性沒有被XmlSerializer序列化

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

...爲什麼不是那個序列化,它怎麼會是?

+0

你是否用上面的類的[Serializable]屬性進行了裝飾? – Rajesh 2012-08-08 09:24:55

+0

@Rajesh它不會有序列化*如果不是... – James 2012-08-08 09:25:59

+0

@James我有同樣的問題,他有,當我用serializable裝飾它解決了問題。特別是當你試圖編寫XML時。 – Rajesh 2012-08-08 09:27:59

回答

4

不派生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; } 
} 
+0

「無法序列化System.Object類型的成員'Items',XmlAttribute/XmlText不能用於編碼複雜類型。」 – user377486 2012-08-08 09:40:40

+0

這是另一個問題,你避免它,因爲序列化程序忽略你的元素,你必須定義實際類型的決心,f.e.串 – 2012-08-08 09:42:38

1

替代解決方案:使用數組代替列表和的XmlElement

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

XmlSerializer的治療列表<>在特殊的方式:

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

這就是爲什麼它將您的類作爲僅列表的對象,沒有您的屬性。最好的解決方案是將List作爲類的公共屬性並將其標記爲XmlElement。

相關問題