C#序列化在将一个类型的版本映射到不同版本的类型时发生问题

时间:2015-06-25 06:40:48

标签: c# .net serialization .net-assembly

背景
我在我的应用程序中遇到了一个使用第三方组件的奇怪情况。我的应用程序中有很多类实现ISerializable接口,基本上来回保持对象状态。当我在一个版本中序列化我的应用程序类并尝试使用不同版本的第三方组件进行反序列化时,我在序列化过程中遇到了兼容性问题。

问题
最新版本的第三方组件看到了一些重要的w.r.t类型和程序集。

对于例如:早期在程序集 A1 下找到类型 T1 。 。发布新版本,其中程序集 A1 现已拆分为两个不同的程序集,例如: A11 A12 T1 类型现在位于 A12

反序列化时的类型 T1 ,正在尝试查找程序集 A1 。但现在因为它被移动到不同的程序集,如 A12 ,它会抛出SerializationException,说明它无法找到程序集 A1

我尝试的事情:

1。 SerializationBinder:
我使用了一个SerializationBinder类,它基本上检查了传入的assemblyName和TypeName信息,并在反序列化时适当地路由到正确的程序集。

2。 AssemblyResolve事件使用ResolveEventHandler委托
基本上我可以从程序集的标识中提取程序集文件名,我可以使用调用Assembly.LoadFrom重新路由更新的路径,我的应用程序可以在其中找到程序集文件,以加载程序集并从ResolveEventHandler方法返回生成的程序集引用< / p>

尽管上述两种方法都在一定程度上起作用。对于在我的应用程序中标记为可序列化的所有类型,将路由信息提供给正确的程序集是一项非常重要的任务。更不用说这必须在将来的版本中再次更新。

所以我来这里寻求帮助/建议/替代方案

这里有没有人遇到过这样的情况? 你是如何解决这个问题的? 如果你可以慷慨地摆脱一些最佳实践和陷阱,以避免在使用序列化与第三方组件时

提前干杯谢谢 VATSAG

1 个答案:

答案 0 :(得分:0)