【问题标题】:Weird BinaryFormatter deseralization error in C#C# 中奇怪的 BinaryFormatter 反序列化错误
【发布时间】:2015-07-10 03:33:13
【问题描述】:

我的一个应用程序(后来称为 ApplicationB)遇到了一个非常奇怪的异常

`Unable to find assembly 'MsgPack, Version=0.5.0.0, Culture=neutral, PublicKeyToken=a2625990d5dc0167'.`

这是我的场景,在我的 ApplicationA 上,我使用 MsgPack 序列化了一个对象,并使用 SE.Redis 将其存储到 Redis 中。稍后,我查询这个对象并反序列化它(当然仍然使用 MsgPack)。完成此操作后,我将通过使用 BinaryFormatter 序列化同一对象的 TCP/组件发送此对象。另一方面,即在 ApplicationB 上,一旦数据包到达,就会使用 BinaryFormatter 对其进行反序列化,这就是我得到异常的地方。

我对 TCP/Component 及其使用的序列化程序没有任何控制权。

那么为什么我会在 ApplicationB 上得到这个错误,它应该知道任何有关 MsgPack 的信息?

只是我想分享的一个想法,似乎 MsgPack 动态创建 DataContract 并且在反序列化时,它可能会在与 BinaryFormatter 冲突的对象上应用一些属性。当然我不确定。

但是有人遇到过这个问题吗?

干杯。

编辑:我注意到对于类型对象的成员,MsgPack 添加了很多成员来定义对象成员中的类型存储(如 IsDictionary、IsList 等)。它会影响 BinaryFormatter 吗?

【问题讨论】:

  • 这是一个简单的“找不到文件”错误。最明显的原因是,ApplicationB 的探测路径中不存在 MsgPack.dll。或者它有错误的版本。使用 Fuslogvw.exe 解决程序集解析问题。
  • 我不需要 ApplicationB 上的 MsgPack.dll,它甚至不应该知道 MsgPack。
  • 嗯,当然可以。它在大声对你大喊大叫。
  • 但是为什么 ApplicationB 需要这个 DLL?

标签: c# serialization deserialization binaryformatter msgpack


【解决方案1】:

使用二进制序列化时,只有完全限定的类型名称及其数据被序列化为字节数组。另一端的序列化器想要反序列化它的数据。它首先从字节数组中读取类型名称并尝试查找并实例化该类型。该类型必须位于 DLL 中的某个位置。因此它会查找给定的 DLL(在您的情况下为 MsgPack),但找不到。因此:确保 DLL MsgPack 位于两侧。

如果无法将 DLL 放在另一端,您可以尝试序列化 DLL 本身并将其发送到另一端。首先反序列化 DLL,将其放在 bin 文件夹中或将其加载到内存中,然后使用其数据反序列化类型。但是你必须真的,真的,真的确定你是否想这样做。我不会。

您是否考虑过使用 WCF 在 AppA 和 AppB 之间进行通信?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多