【发布时间】:2014-08-12 09:57:32
【问题描述】:
我目前正在实现一个工具,用于处理符合标准 Xml 架构的 Xml 文件。到目前为止,我已经从使用 Xml 序列化属性的模式生成了类,并且我正在使用 XmlSerializer 进行反序列化,并且使用正常工作的标准模式。
但是,架构具有各种扩展点,并且这些扩展直到运行时才知道。一个简化的示例可能如下所示:
// ==== In main assembly ====
public class DeclarationRealisation
{
public DataType dataType { get; set; }
}
[XmlInclude(typeof(String)), XmlInclude(typeof(Integer))]
public abstract class DataType : ExtensionInterface { /* ... */ }
// ==== In extension assembly ====
public class Struct : DataType { /* ... */ }
Struct 有自己的 xsd 文件导入主 xsd。
如果我将Struct 放入主程序集中,即使没有XmlInclude 属性(可能sgen 这样做),它也能正常工作。但是如果我将Struct 放入它自己的程序集中(我们将处理扩展的方式),我会得到一个InvalidOperation 说明“指定的类型未被识别”。由于扩展是在运行时加载的,我不能使用XmlInclude。
我已经阅读了实现IXmlSerializable 的可能性,但我宁愿避免手动执行此操作,因为它有很多类。所以,我的问题是:
有没有办法实现这种可扩展性而无需实现
IXmlSerializable?如果没有,是否有工具/代码生成器可以处理此类场景(通过生成界面或任何其他方式)?
注意:我知道您可以在创建 XmlSerializers 时指定额外的类型,但是自动生成的 XmlSerializers 的启动命中(在我的情况下 > 3 秒没有扩展)对于我的用例来说有点多,我想避免它。
编辑:考虑一下,如果在第一次启动期间发生一次性能下降,这可能是可以接受的。有没有办法在运行时生成序列化程序集?我曾经听说 sgen 只是一些框架类的命令行客户端,但现在找不到了。
【问题讨论】: