【问题标题】:Serializing without XmlInclude没有 XmlInclude 的序列化
【发布时间】:2010-09-27 02:01:32
【问题描述】:

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

【问题讨论】:

    标签: c# xml reflection serialization


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      正如 David Norman 所展示的,您可以将类型数组放入 Xml 序列化器中。一个巨大的警告。每次执行此操作时,都会构建和编译一个新的 xml 序列化程序。如果您经常这样做,您将面临巨大的内存泄漏和性能消耗。

      这是一个巨大的内存和性能消耗,请确保您只执行一次。 您可以通过缓存您的 xml 序列化程序来解决此问题:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

      来自 MSDN 的片段:

      动态生成的程序集 为了提高性能,XML 序列化基础结构动态生成程序集以 序列化和反序列化指定类型。基础设施发现 并重用这些程序集。此行为仅在使用 以下构造函数:

      XmlSerializer..::.XmlSerializer(Type)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        相关资源
        最近更新 更多