对象可以跨不同的框架版本序列化/反序列化吗?

时间:2012-02-10 17:19:44

标签: c# .net .net-4.0 .net-3.5 frameworks

我需要使用带有.NET 4.0的BinaryFormatter序列化对象,并将其通过线路(通过SOAP作为字节数组)发送到在.NET 3.5下运行的Web服务。反之亦然。我测试了这个场景,似乎工作正常。

关于SO的这个场景有一个旧的question,它讨论了.NET 1.x到2.0,这并没有让我对这种方法充满信心。

所以它适用于我的测试工具,但我不能测试对象的每个可能的变化,所以我需要一些理论基础。

通常,对象可以跨不同的框架版本序列化/反序列化吗?这是一个公认的场景还是在我的案例中起作用的黑客?

3 个答案:

答案 0 :(得分:1)

如果序列化格式是XML(SOAP)或JSON,它应该绝对没有问题。我不确定二进制序列化对象将如何反应。

答案 1 :(得分:1)

序列化的最大问题是当你有不存在的原语时。地狱,在本地代码中使用某些类型时存在问题,因此它不是服务中的独特问题(假设)。

作为"规则",您可以跨框架版本甚至是用Java,Delphi和COBOL编写的客户端进行序列化(提供具有Web服务能力的版本 - 并且如果您已通过适当的方式公开了序列化对象服务端点)。

我试图想一想.NET中是否存在1.x中没有的原语,因为它们会有问题。您可能尝试序列化任何新的框架对象。你对2.0的危险要小得多(可能不存在?)

越多"开放"您的序列化(即,JSON,SOAP等标准 - 简化:JSON或XML,至少在大多数情况下),您遇到问题的可能性就越小。并且,如果您遇到问题,可以围绕自动代理等进行编码。当您转向二进制时,您可能会在4.0中使用WCF序列化的对象与远程处理客户端之间存在一些不兼容性。

答案 2 :(得分:1)

如果用“二进制”表示BinaryFormatter,则它在版本之间已经非常不容忍,因为它严格依赖于类型元数据(除非您使用自定义绑定非常努力)。因此,当两端使用完全相同的实现时,它只是严格可靠。甚至将属性更改为自动实现的属性是一种重大改变。

这不是“二进制”的失败,而是BinaryFormatter的一个特性。其他二进制序列化器没有此问题。例如,protobuf-net在OS之间,框架之间等工作 - 因为格式a:不关心你的特定类型,b:固定为已发布的规范。

如果您当前正在使用BinaryFormatter:那么IMO是的,您应该明确测试每个API。由于任何类型可能会更改实现细节。不幸的是,由于BF习惯于提取意外数据(通过事件等),即使这不足以验证实际使用情况。