我正在反序列化一个名为Method
.NET Serialization 的类.Method
包含实现的对象列表IAction
.我最初使用该[XmlInclude]
属性来指定实现的所有类IAction
.
但是现在,我想改变我的程序来加载目录中的所有dll并删除实现的类IAction
.然后,用户可以反序列化包含其实施的操作的文件IAction
.
我不再控制实现的类IAction
,因此我无法使用[XmlInclude]
.
有没有办法在运行时设置此属性?或者为实现类设置了类似的属性?
public class Method { public ListActions = 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(); }
David Norman.. 10
XmlSerializer有一个构造函数,它接受一个在反序列化时可以接受的类型数组:
public XmlSerializer( Type type, Type[] extraTypes );
您应该能够将您的assemblyTypes数组作为第二个参数传递.
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中,如以下示例所示.