没有XmlInclude的序列化

Ken*_*enn 12 c# xml reflection serialization

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

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

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

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

public class Method
{
    public List<Actions.IAction> Actions = new List<Actions.IAction>();
}

public interface IAction
{
    void DoExecute();
}

public static Type[] LoadActionPlugins(string pluginDirectoryPath)
{
    List<Type> pluginTypes = new List<Type>();

    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();
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*man 10

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

public XmlSerializer(
   Type type,
   Type[] extraTypes
);
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*rke 6

正如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中,如以下示例所示.