【问题标题】:How to tell System.Xml.Serialization.XmlSerializer to only serialize base class?如何告诉 System.Xml.Serialization.XmlSerializer 只序列化基类?
【发布时间】:2012-04-12 15:35:51
【问题描述】:

我有一个基类MyBase 的对象数组。其中一些对象是派生类的实例,因此当我尝试使用System.Xml.Serialization.XmlSerializer 序列化此数组时,它会因对派生类的抱怨而失败:System.InvalidOperationException:不希望使用 DerivedClass 类型。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。

我不想序列化派生类,我绝对不想将[XmlIgnore()] 放在派生类中(或者[XmlInclude()] 放在基类中,就此而言)!

有没有办法告诉XmlSerializer只为像这个这样的成员序列化基数

[XmlElement("Items")]
public MyBase[] Items
{
    get
    {
        return items.ToArray();
    }
    set 
    {
        items = new HashSet<MyBase>(value);
    }
}

【问题讨论】:

  • 是否将类型传递给 xmlserializer 构造函数?
  • 我确实尝试过这个,但无法让它工作: List derivedTypes = new List(); foreach (MyBase item in items) { derivedTypes.Add(item.GetType()); } XmlSerializer 序列化器 = new XmlSerializer(typeof(RootItem), derivedTypes.ToArray());

标签: c# xmlserializer base-class


【解决方案1】:

您可以对项目集合进行 Linq 查询,过滤类型:

[XmlElement("Items")]
public MyBase[] Items
{
    get
    {
        return items.Where(item => item.GetType() == typeof(MyBase)).ToArray();
    }
    set 
    {
        items = new HashSet<MyBase>(value);
    }
}

【讨论】:

  • .OfType 和/或 .Cast 也可能派上用场
  • 谢谢。无法让它工作。序列化程序不断跳过我的项目。
  • 嗯,我以为你希望它只序列化非派生的MyBase 项目?这部分 Linq 有意跳过不完全属于 MyBase 类型的项目。
  • 经过进一步思考,您可以在 MyBase 类上实现深拷贝构造函数(或实现 IClonable),然后在 Items 的 get 访问器中执行 return items.Select(item =&gt; new MyBase(item)).ToArray();。如果您不想编辑 MyBase 类,则可以通过反射实现许多可用的外部深层复制方法之一。
  • 只要我不必在每个派生类中做额外的工作,我就很高兴。如果我将所有序列化内容放在基类中,然后填充要提供给 XmlSerializer 构造函数的派生类型列表,它就可以工作。这与您的方法相似吗?
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 2021-05-15
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多