2009-02-03 86 views
24

我有一個項目,它使用BinaryFormatter序列化與字符串和布爾結構的集合?數據類型。不同程序集版本的二進制反序列化

序列化/反序列化工作正常,但是如果我要改變這確實它失敗,因爲在表示二進制文件頭的反序列化的工作,它需要的Assembly x代替Assembly y處理數據集。

是否有可能將序列化/反序列化設置爲程序集不可知?

+0

我遇到同樣的問題......很高興知道它已被解決。 – mmr 2009-02-05 00:40:54

回答

19

您可以通過將自定義SerializationBinder分配給格式化程序來控制二進制格式化程序如何解析其類型。通過這種方式,您不需要混淆AppDomain的解決事件,並且消除了意外副作用的風險。

MSDN有一個詳細的例子。

+0

謝謝,這似乎是最安全的選擇 - 尤其是如果我將代碼移入不同的程序集... – 2009-02-03 22:59:02

+0

,但它不起作用(至少對我來說...) – mmr 2009-02-05 01:25:03

5

鉤到AppDomain.OnAssemblyResolve事件和修復行動的程序集名稱

private System.Reflection.Assembly OnAssemblyResolve(System.Object sender, System.ResolveEventArgs reArgs) 
{ 
    foreach(System.Reflection.Assembly assembly in System.AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     System.Reflection.AssemblyName assemblyName = assembly.GetName(); 
     if(assemblyName.FullName == reArgs.Name) 
     { 
       return(assembly); 
     } 
    } 
} 

來源:http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html

+0

我原本打算使用這個,但是我可以看到有可能發生的併發執行失敗的情況。 – 2009-02-03 23:00:32

1

的GAC是你的第一資源,允許不同版本的組件的共存側逐側。但是這並不能真正解決任何問題,除非你的應用程序也具有版本容忍度。二進制序列化有幾個功能來處理版本容忍序列化。請閱讀此MSDN library article

+0

感謝GAC的建議,但是我試圖不要在應用程序中留下沉重的足跡,從它自己的文件夾運行。 – 2009-02-03 22:59:41

3

有依賴於程序集的altenative(二進制)序列化引擎(like this)。

+0

良好的領先,感謝所有這方面的辛勤工作。 – InteXX 2014-06-07 23:28:46

11

您可以更改BinaryFormatter屬性AssemblyFormat以獨立於程序集版本進行序列化。

// Example 
var binFormat = new BinaryFormatter(); 
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
相關問題