基类中的XmlText属性会打破序列化
我有一个名为Name的属性,它具有XmlText属性。
当一个继承类被序列化时,我得到一个异常说:
反映类型'[type name]'的错误。 ---> System.InvalidOperationException:不能序列化类型为“[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
类中使用的虚拟属性或字段来使它工作。 如果你从来没有给它赋值,它将保持为空,并且不会被序列化,但它会阻止你的类被视为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序列化不是必需的。)
无论如何,你真的需要序列化为XML文本的Name
? 这很少见,通常XML元素有简单的内容(文本)或子元素......两者混合使得XML难以阅读,所以除非你被迫这么做,否则我建议你将Name
作为一个属性序列化,或者子元素。
上一篇: XmlText attribute in base class breakes serialization
下一篇: Why isn't my public property serialized by the XmlSerializer?