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

时间:2010-03-23 15:59:24

标签: .net serialization xml-serialization

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

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

  

有反映类型的错误   '[类型名称]'。 --->   System.InvalidOperationException:   无法序列化'[type]类型的对象   名称]'。基本类型'[基本类型名称]'   有简单的内容,只能是   通过添加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>
{

}

1 个答案:

答案 0 :(得分:15)

似乎发生了因为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;
}

(顺便说一句,请注意,XML序列化不需要Serializable属性。)

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