2015-04-30 82 views
1

我在我的應用程序的一個遇到一個非常奇怪的異常(後來被引用爲ApplicationB怪異的BinaryFormatter deseralization錯誤

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

這裏是我的方案,我ApplicationA我有一個序列化的對象使用MsgPack並使用SE.Redis將其存儲到Redis中。稍後,我查詢這個對象並反序列化它(當然仍然使用MsgPack)。完成此操作後,我通過TCP/Componennt發送此對象,該對象使用BinaryFormatter對該同一對象進行序列化。另一方面,即在應用程序B,一旦數據包到達,它使用BinaryFormatter反序列化,這是我得到例外。

我對TCP/Component及其使用的序列化程序沒有任何控制權。

那麼,爲什麼我會得到這個錯誤應用程序B應該知道關於MsgPack的任何事情?

只是一個我想分享的想法,似乎MsgPack實時創建DataContract,並且在反序列化時,它可能會在與BinaryFormatter衝突的對象上應用一些屬性。當然,我不確定這一點。

但有沒有人遇到過這個問題?

乾杯。

編輯:我注意到,對於類型對象的成員,MsgPack添加了很多用於在對象成員中定義類型存儲的成員(如IsDictionary,IsList等)。它會影響BinaryFormatter嗎?

+2

這是一個簡單的「文件未找到」錯誤。最明顯的原因是MsgPack.dll不在ApplicationB的探測路徑中。或者它有錯誤的版本。使用Fuslogvw.exe解決程序集解析問題。 –

+0

我不需要** ApplicationB **上的MsgPack.dll,它甚至不應該知道MsgPack。 –

+2

嗯,當然你有。它大聲地對你大喊。 –

回答

3

使用二進制序列化時,只有完全限定類型名稱及其數據被序列化爲字節數組。另一方的序列化器想要反序列化其數據。它首先從字節數組中讀取類型名稱,並嘗試查找並實例化該類型。該類型必須位於DLL中的某個位置。所以它尋找給定的DLL(在你的案例MsgPack),但它不能被發現。因此:確保DLL MsgPack位於兩側。

如果無法將DLL放在另一邊,您可以嘗試序列化DLL本身並將其發送到另一端。首先反序列化DLL,將其放入bin文件夾或將其加載到內存中,然後使用其數據反序列化該類型。但是,如果你想這樣做,你必須真的確實確定。我不會。

你有沒有考慮過在AppA和AppB之間使用WCF進行通信?