2009-09-23 23 views
7

如果我在名爲「AssemblyA」的程序集中有一個名爲「MyClass」的類,並使用.NET的BinaryFormatter將其序列化爲一個文件。那麼,「MyClass的」的代碼轉移到一個名爲「AssemblyB」組件,並嘗試反序列化,我得到了下面的「System.TypeLoadException」異常文件:C#反序列化已移動或已重命名的類

未能加載從裝配型「AssemblyA.MyClass」' AssemblyA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。

我有什麼方法可以表明該類已被移到AssemblyB中嗎?通過某種屬性?或者是否有可能將序列化文件修改爲預處理步驟,將所有從AssemblyA.MyClass引用到AssemblyB.MyClass的引用?最後,如果這兩種選擇都不可行,是否有可能繞過試圖對這個類進行反序列化並繼續對其餘數據進行反序列化?

回答

6

如果移動它,然後添加到它現在所在的DLL的引用,並使用TypeForwardedToAttribute

[assembly:TypeForwardedTo(typeof(TheType))] 

這將是足以讓一些請求(包括BinaryFormatter IIRC)尋找一個類型在新的裝配中找到它。然而,IIRC它僅適用於最外層的類型(不是嵌套的類型,以及可能不是仿製藥),你可以不用給它改名/改變了命名空間/等

更名爲tricker ... BinaryFormatter是出了名的脆性有關這樣的事情。 IMO只適用於兩個緊密耦合系統之間的瞬態數據序列化(例如,在同一過程中兩個AppDomain之間的交換;當用於存儲時,或者在可能不同步的系統之間時,它可能是一場噩夢。

它可能爲時已晚,但我會建議使用基於合同的串行器(而非基於類型的序列化);任何的XmlSerializerDataContractSerializer(只要您使用[DataContract]/[DataMember]屬性),等等。如果你想要快速二進制文件,protobuf-net會做得很好(如果你需要的話,可以連接到ISerializable)。

另一個值得關注的概念是序列化代理, t比較難。但是IIRC可以讓你控制所創建的類型 - 但是你需要爲它做一個lot

相關問題