序列化派生(未知)类型

时间:2013-09-19 14:50:03

标签: c# xml-serialization derived-class

让我们用一堆假设开始这个线程:
第一个假设:我们有一个库(* .dll),其中包含以下代码:

class Program {
    static void Main(string[] args) {
        XmlSerializer ser = new XmlSerializer(typeof(Foo));
    }
}

public class Foo { public string name;}

第二个假设:我们得到了一个源自Foo的课程,我们称之为Bar。

public class Bar : Foo { }

此课程位于图书馆外。

现在有了神奇之处:Bar-class是通过Reflection加载的,所以我们不知道它在编译时是否存在。此外,XmlSerializer不知道派生类的任何内容,因为我们在一个完全不同的库中,我们不能简单地在此处添加XmlInclude,因为我们无法更改Foo - 类的代码。那么有没有办法在XmlSerializer - 类的实例上使用现有的Bar(我知道当前的实现ser根本不可见任何外部代码,但是让我们把它放在一边,并假设我们可以从Bar - 类中访问序列化器?

这可以通过在类的定义前面使用Bar - 类([System.Xml.Serialization ...])的属性来实现吗?

1 个答案:

答案 0 :(得分:0)

假设 wierd 原因存在这些限制,并且您的XmlSerializer需要一个类型参数,那么您需要获取参数的运行时类型。

var barInstance = However().You().Reflect().To().Get().Bar();

// The runtime type
var barType = barInstance.GetType();

var ser = XmlSerializer(barType);

typeof(T)在编译时获取类型,但由于您无法访问该类型,因此您需要Obj.GetType();