没有XmlInclude的序列化

我正在使用.NET序列化反序列化一个名为Method的类。 Method包含实现IAction的对象列表。 我最初使用[XmlInclude]属性来指定实现IAction所有类。

但是现在,我想改变我的程序来加载目录中的所有dll并删除实现IAction的类。 然后,用户可以反序列化包含实现IAction的操作的文件。

我不再控制实现IAction的类,因此我不能使用[XmlInclude]

有没有办法在运行时设置此属性? 或者为实现类设置了类似的属性?

 public class Method { public List Actions = new List(); } public interface IAction { void DoExecute(); } public static Type[] LoadActionPlugins(string pluginDirectoryPath) { List pluginTypes = new List(); string[] filesInDirectory = Directory.GetFiles(pluginDirectoryPath, "*.dll", SearchOption.TopDirectoryOnly); foreach (string pluginPath in filesInDirectory) { System.Reflection.Assembly actionPlugin = System.Reflection.Assembly.LoadFrom(pluginPath); Type[] assemblyTypes = actionPlugin.GetTypes(); foreach (Type type in assemblyTypes) { Type foundInterface = type.GetInterface("IAction"); if (foundInterface != null) { pluginTypes.Add(type); } } } return pluginTypes.Count == 0 ? null : pluginTypes.ToArray(); } 

XmlSerializer有一个构造函数,它接受在反序列化时将接受的类型数组:

 public XmlSerializer( Type type, Type[] extraTypes ); 

您应该能够将assemblyTypes数组作为第二个参数传递。

正如David Norman所示,您可以在Xml Serializer中添加一系列类型。 一个巨大的警告。 每次执行此操作时,都会构建并编译新的xml序列化程序。 如果你这么做的话,你手上会有巨大的内存泄漏和性能损失。

这是一个巨大的记忆和性能,确保你只做一次。 您可以通过缓存xml Serializer来解决此问题: http : //msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

来自MSDN的片段:

动态生成的程序集为了提高性能,XML序列化基础结构动态生成程序集以序列化和反序列化指定的类型。 基础结构查找并重用这些程序集。 仅当使用以下构造函数时,才会出现此问题:

XmlSerializer的.. ::。XmlSerializer的(类型)

XmlSerializer .. ::。XmlSerializer(Type,String)

如果使用任何其他构造函数,则会生成同一程序集的多个版本,并且永远不会卸载,这会导致内存泄漏和性能下降。 最简单的解决方案是使用前面提到的两个构造函数之一。 否则,必须将程序集缓存在Hashtable中,如以下示例所示。