序列化派生(未知)类型

本文关键字:类型 未知 派生 序列化 | 更新日期: 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();