基类中的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作为一个属性序列化,或者子元素。

链接地址: http://www.djcxy.com/p/65135.html

上一篇: XmlText attribute in base class breakes serialization

下一篇: Why isn't my public property serialized by the XmlSerializer?