2012-10-26 63 views
5

我正在序列化一些數據,如字段和自定義類來創建二進制數據(字節數組)。反序列化異常:無法找到程序集

然後我想Deserialize它從二進制數據返回到字段和類。

但我得到一個異常。如果這兩種方法會在同一個程序集中發生,那麼它們都可以正常工作 - 但不是。

我在一個assambly中進行序列化,並在另一個序列化中進行反序列化。這也是說: Unable to find assembly 'MyAssamblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

注1:我沒有問題領域退回,只有類導致他們。

注2:我在這兩個程序集中都有相同的類。

+0

K ...上下文;我們應該假設你正在使用BinaryFormatter?您序列化的類型是在兩個項目都引用的程序集中?您是否意外地通過事件連續發佈比您預期更多的數據? (這經常發生) –

回答

6

注2:我有兩個組件

不,你不會這個相同的類。至少,與運行時間無關。你有兩種不同的類型碰巧有相同的名字。一種類型是通過其組裝定義爲。因此,「AssemblyA中的」SomeType「與」AssemblyB中的SomeType「完全不同,即使它們碰巧是從相同的源文件編譯的。

BinaryFormatter適用於類型信息,所以這不起作用。一種選擇是將類型移動到其他項目都引用的庫dll中,然後只定義一次,並且它會很開心。

另一種選擇是使用基於合同的序列化程序(而不是基於類型的序列化程序)。這意味着即使它們在不同的程序集中(也許有不同的來源,只要它「足夠類似」),那麼「看起來類似的類」是很好的。如果你想要密集的原始二進制文件,適合的串行器的例子包括(另外還有一些)XmlSerializer,DataContractSerializer(但不是NetDataContractSerializer),JavaScriptSerializer或protobuf-net。

+0

是的,我使用BinaryFormatter。我想和你的第一個選項一起去。那麼,我必須創建一個新項目,並將它們添加到其他兩個項目中?我對嗎? –

+1

在解決方案中,添加一個新項目 - 選擇「庫」。現在把課程放在那裏,遠離另外兩個地方。最後,對於原始項目:引用,添加引用...選擇剛剛創建的新庫項目。 –

+0

這就是我剛做的! Thxa很多伴侶。會讓你知道它是否會起作用(但我知道它會:))。 –

2

所有包含要反序列化的對象的類層次結構中的類的程序集必須存在於執行此反序列化的應用程序中。可以明確引用它們(如果您需要這些類的編譯時安全性),或者只將它們放在應用程序的bin文件夾中,以便可以在運行時解析它們。如果它們沒有被明確地引用,你將不得不使用反射來讀取反序列化實例中的值。