我有一个项目,使用BinaryFormatter对由字符串和布尔型数据类型组成的结构体集合进行序列化。
序列化/反序列化工作正常,但如果我更改执行操作的程序集,则反序列化失败,因为二进制文件中的头部指示需要 程序集x
而不是 程序集y
来处理数据。
是否可以设置序列化/反序列化为程序集不可知?
我有一个项目,使用BinaryFormatter对由字符串和布尔型数据类型组成的结构体集合进行序列化。
序列化/反序列化工作正常,但如果我更改执行操作的程序集,则反序列化失败,因为二进制文件中的头部指示需要 程序集x
而不是 程序集y
来处理数据。
是否可以设置序列化/反序列化为程序集不可知?
通过为格式化器分配自定义的SerializationBinder,您可以控制二进制格式化器如何解析其类型。这样,您不需要处理AppDomain的解析事件,并消除了由此带来的意外副作用的风险。
在MSDN上有一个详细的示例。
您可以更改BinaryFormatter属性的AssemblyFormat,使序列化独立于程序集版本。
// Example
var binFormat = new BinaryFormatter();
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
通过Hook 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
这是一篇关于.NET应用程序中线程池的文章。线程池是一个管理并发性的机制,它可以在需要时分配和重用线程。在.NET中,线程池是由CLR(公共语言运行库)提供的。本文探讨了如何使用线程池来提高应用程序的性能和可伸缩性。GAC(全局程序集缓存)是您的首要资源,允许不同版本的程序集共存。但这并不能解决问题,除非您的应用程序也具备版本兼容性。二进制序列化具有多个功能来处理版本兼容性序列化。阅读MSDN library article中的相关内容。