我在我的某个应用程序上遇到了一个非常奇怪的异常(后来引用为 ApplicationB )
`Unable to find assembly 'MsgPack, Version=0.5.0.0, Culture=neutral, PublicKeyToken=a2625990d5dc0167'.`
这是我的方案,在我的 ApplicationA 上,我使用MsgPack序列化了一个对象,并使用SE.Redis将其存储到Redis中。稍后,我查询此对象并反序列化它(当然仍然使用MsgPack)。完成后,我将通过TCP /组件发送此对象,该组件使用BinaryFormatter序列化此相同对象。另一方面,即在 ApplicationB 上,一旦数据包到达,它就会使用BinaryFormatter进行反序列化,这就是我得到异常的地方。
我对TCP / Component及其使用的串行器没有任何控制权。
那么为什么我会在 ApplicationB 上得到这个错误,它应该知道关于MsgPack的任何事情?
只是想要分享一个想法,似乎MsgPack即时创建DataContract,并且在反序列化时,它可能会在与BinaryFormatter冲突的对象上应用一些属性。我当然不确定。
但有没有人遇到过这个问题?
干杯。
编辑:我注意到对于类型对象的成员,MsgPack添加了许多成员来定义对象成员中的类型存储(如IsDictionary,IsList等)。它会影响BinaryFormatter吗?
答案 0 :(得分:3)
使用二进制序列化时,只将完全限定类型名称及其数据序列化为字节数组。另一方面的序列化程序想要反序列化其数据。它首先从字节数组中读取类型名称,然后尝试查找并实例化该类型。该类型必须位于DLL中的某个位置。所以它查找给定的DLL(在您的情况下为FILES=$(zenity --file-selection --multiple --separator=' ' --title "Pick a file")
for f in $FILES ; do
echo "File: $f"
done
),但无法找到它。因此:确保DLL MsgPack
位于两侧。
如果无法在另一端安装DLL,您可以尝试序列化DLL本身并将其发送到另一端。首先反序列化DLL,将其放在bin文件夹中或将其加载到内存中,然后使用其数据反序列化类型。但你必须真的,真的,确实如果你想这样做。我不愿意。
你有没有考虑过使用WCF在AppA和AppB之间进行通信?