20

我正在使用 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?

4

5 回答 5

20

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

于 2011-09-23T20:58:40.320 回答
3

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

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

于 2010-11-16T12:32:04.207 回答
3

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

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

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

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

于 2010-11-16T12:58:25.700 回答
2
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 对象。

于 2014-09-01T12:38:47.950 回答
-1

你不能!

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

于 2010-11-16T12:14:59.167 回答