当前位置:  开发笔记 > 编程语言 > 正文

没有XmlInclude的序列化

如何解决《没有XmlInclude的序列化》经验,为你挑选了2个好方法。

我正在反序列化一个名为Method.NET Serialization 的类.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();
}

David Norman.. 10

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

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

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



1> David Norman..:

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

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

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



2> JoshBerke..:

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有