如何让BinaryFormatter在不同的应用程序中反序列化

时间:2010-11-16 12:07:52

标签: c# .net serialization binaryformatter

我正在使用BinaryFormatter将类实例数组序列化为文件。我可以在同一个应用程序中反序列化这个罚款。当我在不同的应用程序中尝试相同的反序列化(它引入了一个执行工作的公共文件)时,我收到以下错误:

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."}

其中pmlscan是原始应用程序的名称。如何让BinaryFormatter不尝试加载pmlscan?

5 个答案:

答案 0 :(得分:18)

答案 1 :(得分:3)

二进制序列化程序将类和程序集信息编码为二进制数组。反序列化此数组时,反序列化程序使用此信息来查找类所在的程序集,并(如有必要)将程序集加载到您的应用程序域中。如果其他应用程序无法访问类类型所在的程序集,那么您将看到您收到的错误。

如另一张海报所述,将这些常用类放入共享程序集中,并将它们部署到客户端/其他应用程序以及服务器应用程序。

答案 2 :(得分:2)

如果类是相同的,并且它只是另一个程序集,您可以尝试向您的.config文件添加assemblyBinding部分。

您还应该阅读有关Resolving Assembly LoadsTypeResolve event的文章。

使用这些技术,您可以在反序列化时将.Net类型系统重定向到另一种类型。

注意:将共享类迁移到共享.dll将是一个更简单的解决方案。

答案 3 :(得分:1)

sealed class PreMergeToMergedDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        return Type.GetType("BinarySerialization.YourClass");
    }
}
BinaryFormatter bfDeserialize = new BinaryFormatter();
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder();
while (fsRead.Position < fsRead.Length)
{
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead);
}

假设您有一个exe序列化“YourClass”中的数据,另一个exe序列化了YourClass对象。

答案 4 :(得分:0)

你不能!

最佳选择是在单独的程序集中发布可序列化类,并在服务器(序列化程序)和客户端(反序列化程序)中引用它。这样您就不会将整个源代码发布到外部世界。

相关问题