我正在使用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?
答案 0 :(得分:18)
您可以使用自定义SerializationBinder来实现它。见这里:Advanced Binary Serialization: Deserializing an Object Into a Different Type Than the One It was Serialized Into
答案 1 :(得分:3)
二进制序列化程序将类和程序集信息编码为二进制数组。反序列化此数组时,反序列化程序使用此信息来查找类所在的程序集,并(如有必要)将程序集加载到您的应用程序域中。如果其他应用程序无法访问类类型所在的程序集,那么您将看到您收到的错误。
如另一张海报所述,将这些常用类放入共享程序集中,并将它们部署到客户端/其他应用程序以及服务器应用程序。
答案 2 :(得分:2)
如果类是相同的,并且它只是另一个程序集,您可以尝试向您的.config文件添加assemblyBinding部分。
您还应该阅读有关Resolving Assembly Loads和TypeResolve 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)
你不能!
最佳选择是在单独的程序集中发布可序列化类,并在服务器(序列化程序)和客户端(反序列化程序)中引用它。这样您就不会将整个源代码发布到外部世界。