没有XmlInclude的序列化

时间:2008-12-16 01:57:16

标签: c# xml reflection serialization

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

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:6)

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

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

来自MSDN的

片段:

  

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

     

XmlSerializer .. ::。XmlSerializer(Type)

     

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

     

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