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


我有一个基类,有一个名为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>
{

}

11865
2018-03-23 15:59


起源



答案:


这似乎是因为 LookupItem class在其XML表示中没有子元素。因此, XmlSerializer 认为它是一个 简单文本 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;
}

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

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


15
2018-03-23 17:23