我遇到了XML序列化和反序列化类的问题,该类包含实现基本抽象类的具体类的实例集合。
我的解决方案是这样组织的:
以下是我的课程示例:
假设我在一个项目中有这个抽象类,名为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可分配的类型数组。
提前致谢!我一直在努力找出满足我要求的解决方案,并且整天都在互联网上搜索。