2009-02-03 50 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; 
相关问题