基类中的XmlText属性会破坏序列化

Jer*_*emy 11 .net serialization xml-serialization

我有一个带有名为Name的属性的基类,它具有XmlText属性.

当一个继承的类被序列化时,我得到一个异常说:

反映类型'[类型名称]'时出错.---> 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>
{

}
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 15

似乎是因为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;
}
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,请注意,SerializableXML序列化不需要该属性.)

无论如何,你真的需要序列Name化为XML文本吗?这是非常罕见的,通常XML元素有简单的内容(文本)或子元素......两者的混合使XML更难阅读,所以除非你被迫这样做,我建议你序列Name化为属性或孩子元件.