当前位置: 首页 > 编程语言 > C#

VersionTolerantSerialization–HowtoFindtheOriginalAssemblyName分享

时间:2023-04-11 03:05:53 C#

VersionTolerantSerialization–HowtoFindtheOriginalAssemblyNameIn.NET2.0(andIthinklaterversions),VersionTolerantSerialization会成功的从旧版本改过来对象所在的程序集反序列化序列化对象。当我用十六进制查看器(简单的拖放到VS中)打开这样一个二进制格式的序列化流时,我可以看到这个流中包含的程序集信息。在反序列化过程中,有没有办法检索这些信息?例如,这可用于在阅读旧内容时对已知问题应用修复。更新:看起来无法完成(除了更改类本身,如PaulBetts的回答,也未测试)那么还有其他方法可以读取此值吗?是否发布了二进制格式?我在撰写CodeProject文章时发现了这些序列化问题(滚动到“从磁盘加载目录”,大约写到一半)。基本上我正在使用ASP.NET应用程序序列化一些东西-并且在重新启动IIS应用程序后无法读取序列化数据(由于ASP.NET所做的整个动态编译/临时程序集缓存/等)!哎哟!不管怎样,我的第一点是反序列化过程中抛出的异常包括Assemblyh4octhiwnotfoundbystrongname,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null显然你是对的,你想要的信息在“某处”。理论上(是的,这是一个可怕的想法)你可以捕获序列化异常并解析旧版本详细信息的错误(当然“当前”反序列化可以在不丢弃的情况下工作)......但也可能有更好的方法。..第二点涉及我实施的解决方案(使用此信息)。我写了一个自定义的System.Runtime.Serialization.SerializationBinder:代码如下所示作为示例。publicclassCatalogBinder:System.Runtime.Serialization.SerializationBinder{publicoverrideTypeBindToType(stringassemblyName,stringtypeName){//将“完全限定(即inc命名空间)类型名称”获取到数组中string[]typeInfo=typeName.Split('.');//因为最后一项是类名,我们将//在*this*命名空间/程序集字符串中“查找”它className=typeInfo[typeInfo.Length-1];if(className.Equals("Catalog")){returntypeof(Catalog);}elseif(className.Equals("Word")){returntypeof(Word);}if(className.Equals("File")){returntypeof(File);}else{//传回传入的内容!返回Type.GetType(string.Format("{0},{1}",typeName,assemblyName));基本上,反向序列化过程为BindToType提供了“替换”最初用于序列化对象的已知类型的机会。我只使用typeName,但assemblyName可能包含您要查找的信息,而自定义SerializationBinder可能是您应该调查以“使用”它的东西。仅供参考,上面的代码是这样“连接”的:System.Runtime.Serialization.IFormatterformatter=newSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter();formatter.Binder=newCatalogBinder();//这是重要的一点objectdeserializedObject=formatter.Deserialize(stream);向所有名为AssemblyInfo的序列化类添加一个字段,该字段设置为Assembly.GetExecutingAssembly()。FullName使用LutzRoeders(现在是RedGate的)Reflector。BinaryFormatter的Deserialize方法在内部使用System.Runtime.Serialization.Formatters.Binary.__BinaryParser类来执行实际的解析。在反射器中四处闲逛可能会让您了解如何预读二进制头文件并确定版本信息。以上就是C#学习教程:版本容错序列化-如何找到原来AssemblyName共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: