序列化派生(未知)类型
本文关键字:类型 未知 派生 序列化 | 更新日期: 2023-09-27 18:32:11
>让我们从一堆假设开始这个线程:
第一个假设:我们有一个库(*.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 类是通过反射加载的,所以我们在编译时不知道它的存在。此外,XmlSerializer
对派生类一无所知,因为我们在一个完全不同的库中,所以我们不能简单地在这里添加XmlInclude
,因为我们无法更改Foo
类的代码。那么有没有办法在 Bar
-class 的实例上使用现有的XmlSerializer
(我知道通过当前的实现,ser
对任何外部代码都根本不可见,但让我们把这个放在一边,假设我们可以从 Bar
-class 中访问序列化程序)?
这是否可以通过在类定义前面使用Bar
-类的属性来实现([System.Xml.Serialization...])?
假设这些限制出于奇怪的原因而存在,并且您的 XmlSerializer 需要一个类型参数,那么您需要获取参数的运行时类型。
var barInstance = However().You().Reflect().To().Get().Bar();
// The runtime type
var barType = barInstance.GetType();
var ser = XmlSerializer(barType);
typeof(T) 在编译时获取类型,但由于您无权访问该类型,因此需要 Obj.GetType();