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

12

我有一个基类,其中有一个带有XmlText属性的Name属性。

当序列化继承类时,我会收到一个异常:

反射 '[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>
{

}
1个回答

16
似乎会发生这种情况是因为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 序列化不是必需的。)
无论如何,你真的需要将 Name 序列化为 XML 文本吗?这相当不寻常,通常 XML 元素要么具有简单内容(文本),要么具有子元素... 两者混合在一起会使 XML 更难阅读,因此除非你被迫这样做,否则我建议你将 Name 序列化为属性或子元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接