我有一个项目,它使用BinaryFormatter来序列化字符串和bool的结构集合?数据类型。
序列化/反序列化工作正常,但是如果我要更改执行工作的程序集,则无法反序列化,因为二进制文件中的标题表明它需要Assembly x
而不是Assembly y
处理数据。
是否可以将序列化/反序列化设置为与程序集无关?
答案 0 :(得分:22)
您可以通过将自定义SerializationBinder分配给格式化程序来控制二进制格式化程序如何解析其类型。通过这种方式,您不需要混淆AppDomain的解决事件,并且可以消除由此产生意外副作用的风险。
MSDN有一个详细的例子。
答案 1 :(得分:12)
您可以更改BinaryFormatter属性AssemblyFormat,使序列化与程序集版本无关。
// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
答案 2 :(得分: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
答案 3 :(得分:3)
有一些不依赖于程序集的替代(二进制)序列化引擎(like this)。
答案 4 :(得分:1)
GAC是您的第一个资源,允许不同版本的程序集并排共存。但除非您的应用程序也具有版本容忍度,否则这并不能解决任何问题。二进制序列化具有几个功能来处理版本容错序列化。在此MSDN library article中了解相关信息。