【问题标题】:SerializationException for dynamically loaded Type动态加载类型的 SerializationException
【发布时间】:2012-02-28 01:20:31
【问题描述】:

由于我之前的问题 (XML serialization of interfaces),我遇到了另一个问题...

我有一个从数据库导出数据的应用程序。导出过程由实现用于调用的通用接口的不同具体类实现。

具体实现是作为插件 (DLL) 加载的,因此我不会在我的代码中直接引用它们。

我需要将这些具体类的实例作为字节数组序列化到我的数据库中,但是现在当我尝试从字节数组中反序列化它们时,我得到了一个 SerializationException: Unable to find assembly …

我想它的出现是因为我在运行时加载了带有我的接口的具体实现的 dll...

我该如何解决?

注意 我正在使用这段代码来反序列化对象:

    public static object DeSerialize(byte[] arrayToDeSerialize)
    {
        object serializedObject;
        using (MemoryStream stream = new MemoryStream(arrayToDeSerialize))
        {
            //Creating binary formatter to De-Serialize string.
            BinaryFormatter formatter = new BinaryFormatter();

            //De-Serializing.
            serializedObject = formatter.Deserialize(stream);
        }
        return serializedObject;
    }

【问题讨论】:

    标签: c# .net serialization dynamic dll


    【解决方案1】:

    您可以挂钩AppDomain.AssemblyResolve 事件以根据需要加载程序集。每次运行时需要它无法解析的程序集时都会引发该事件。它使您有最后一次机会在引发“无法找到程序集”异常之前提供程序集。示例在我链接的页面上。

    【讨论】:

    • 感谢您的建议,我认为它可以解决我的问题,但我无法理解如何将其应用于我的反序列化方法...对不起,但我是 .NET 序列化的新手...
    • 我正在开发一个 WinForm 应用程序,我必须在其中声明我的 AppDomain 和事件处理程序?在我的Program 课堂上?
    • 只需使用 AppDomain.CurrentDomain:msdn.microsoft.com/en-us/library/…。您的 Main 可能是挂钩该事件的好地方。
    • 好的,将处理程序放在我的Main 中,事件被触发,但是有问题...... 987654328@。我错了吗?
    • 你必须return解析的类型。事件处理程序的奇怪语义。请参阅 AssemblyResolve 原始链接中的示例,位于底部:return typeof(MyType).Assembly;
    猜你喜欢
    • 2013-01-27
    • 2014-05-21
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2014-09-27
    • 2021-02-08
    相关资源
    最近更新 更多