Dot-Net

基類中的 XmlText 屬性破壞了序列化

  • June 26, 2018

我有一個基類,它有一個名為 Name 的屬性,它有一個 XmlText 屬性。

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

反映類型 ’ 時出現錯誤

$$ type name $$’。—> System.InvalidOperationException:無法序列化類型的對象’$$ type name $$’。基本類型 ‘$$ base type name $$’ 具有 simpleContent 並且只能通過添加 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>
{

}

這似乎是因為LookupItem該類在其 XML 表示中沒有子元素。因此,XmlSerializer認為它是一個simpleContent XML 元素。如果您向 中添加一個新屬性LookupItem,該屬性將被序列化為 XML 元素,則它可以正常工作。

我只是花了幾分鐘查看可用的 XML 序列化屬性,但我找不到任何可以指定類型不是simpleContent元素的東西……

LookupItem所以我認為你可以通過添加一個你在課堂上從未使用過的虛擬屬性或欄位來使其工作。如果您從未為它分配值,它將保持為 null 並且不會被序列化,但它會阻止您的類被視為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;
}

(順便說一句,請注意SerializableXML 序列化不需要該屬性。)

無論如何,您真的需要序列Name化為 XML 文本嗎?這很不常見,通常 XML 元素要麼有簡單的內容(文本),要麼有子元素……兩者的混合使 XML 更難閱讀,所以除非你被迫這樣做,否則我建議你序列Name化為屬性或子元素元素。

引用自:https://stackoverflow.com/questions/2501466