如何序列化&反序列化从运行时未知的抽象类派生的类型?

时间:2016-08-02 16:18:13

标签: c# serialization xml-serialization abstract-class abstract

我遇到了XML序列化和反序列化类的问题,该类包含实现基本抽象类的具体类的实例集合。

我的解决方案是这样组织的:

  1. 包含名为Base。
  2. 的抽象类的类库项目
  3. 另一个类库项目,用作插件,包含一个名为Derived的具体类,它实现了Base。我将有多个这样的项目,因为我将把它们作为主要项目的插件加载。
  4. 一个应用程序,这是主要项目。它知道使用第一个项目作为参考,并加载插件程序集,这些程序集在运行时导出实现Base的具体类,如第二个项目。在启动时,使用反射加载程序集后,它会加载实现Base的类的序列化实例,并在关闭时反序列化它们。
  5. 以下是我的课程示例:

    假设我在一个项目中有这个抽象类,名为BaseClassProj:

    public abstract class Base
    {
        public int  BaseProp { get; set; }
    }
    

    我有另一个项目,DerivedClassProj,我实现了Base抽象类,并添加了一些属性:

    public class Derived : Base
    {
        public string DerivedProp { get; set; }
    }
    

    然后有一个第三个和主项目,其中我有一个类,其中包含一个字典,其中键类型是必须是某个派生类Base的类型的名称,以及值是给定类型的实例的集合。 ObservableDictionary是XML可序列化的,实现是here。例如:

    public class Manager
    {
        public ObservableDictionary<string, ObservableCollection<Base>> Instances { get; set; }
    }
    

    问题是在运行时我将类型加载到我的主项目中,所以我不知道我要提前加载的类型,这意味着我不能使用XmlInclude ,这是为什么我用这个:

    // Type = Base, extraTypes = { Derived, [another derived class, ...] }
    public XmlSerializer(Type type, Type[] extraTypes){..}
    

    XmlSerializer构造函数的重载,以便对主类进行序列化和反序列化。

    当我尝试序列化Manager类时,抛出了InvalidOperationException:

      

    不期望Derived类型(或实现Base的任何其他具体类)。使用XmlInclude或SoapInclude属性指定静态未知的类型。

    就像我说的那样,我不知道我提前序列化和反序列化时正在处理的类型,因为我在运行时使用反射加载它们,因此我无法使用XmlInclude属性基类。在序列化或反序列化之前我唯一知道的是Base可以从我正在处理的类型中分配。

    那么问题是什么呢?我初始化了XmlSerializer,其中typeof(Base)作为主要类型,以及Base可分配的类型数组。

    提前致谢!我一直在努力找出满足我要求的解决方案,并且整天都在互联网上搜索。

0 个答案:

没有答案