如何让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?

您可以使用自定义SerializationBinder来实现它。 请参阅此处: 高级二进制序列化:将对象反序列化为与序列化的对象不同的类型

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

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

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

您还应该阅读有关解决程序集加载和TypeResolve事件的文章 。

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

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

 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对象。

你不能!

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