2010-03-23 65 views
11

我有一個名爲Name的屬性,它具有XmlText屬性。基類中的XmlText屬性打破了序列化

當繼承的類被序列我得到一個異常說:

有反射式 「[類型名稱]」錯誤。 ---> System.InvalidOperationException: 無法序列化類型爲'[type name]'的對象'。基本類型'[基本類型名稱]' 具有簡單的內容,並且只能通過添加XmlAttribute 元素來擴展 。請考慮將 XmlText基類的成員更改爲 字符串數組。

這裏是我的類定義,當序列化爲xml時發生錯誤。

[Serializable] 
public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 
} 

[Serializable] 
public class Vendor : LookupItem 
{ 
    public string ContactNumber { get; set; } 
} 

[Serializable] 
public class Vendors : List<Vendor> 
{ 

} 

回答

15

它似乎發生是因爲LookupItem類在其XML表示中沒有子元素。因此,XmlSerializer認爲它是一個simpleContent XML元素。如果您將一個新屬性添加到要作爲XML元素序列化的LookupItem,它可以正常工作。

我只花了幾分鐘看可用XML序列化屬性,但我無法找到任何這將允許指定的類型不是simpleContent元素...

所以我認爲你可以通過添加您從未在LookupItem類中使用的虛擬屬性或字段來使其工作。如果你從來沒有給它賦值,它將保持爲空,並且不會被序列化,但它會阻止你的類被視爲simpleContent。我知道這是一個骯髒的解決辦法,但我認爲沒有其他簡單的方法...

public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 

    public object _dummy; 
} 

(順便說一句,請注意Serializable屬性是沒有必要的XML序列化。)

不管怎樣,你真的需要將Name作爲XML文本序列化?這很少見,通常XML元素具有簡單的內容(文本)或子元素......兩者混合使得XML難以閱讀,所以除非您被迫這樣做,否則我建議您將Name作爲屬性序列化或子元素。

相關問題