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

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

我需要在 .NET 4.0 中使用 BinaryFormatter 序列化一个对象,然后通过网络将其发送(通过 SOAP 作为字节数组)到在 .NET 3.5 下运行的 Web 服务。反之亦然。我已经测试了这种情况,它似乎工作正常。

有一个老question关于 SO 上的这种情况,它谈论的是 .NET 1.x 到 2.0,这并没有让我对该方法充满信心。

所以它适用于我的测试工具,但我无法测试该对象的所有可能变体,因此我需要一些理论基础。

通常,对象可以跨不同的框架版本进行序列化/反序列化吗?这是一个可以接受的场景还是对我有用的黑客攻击?

最佳答案

如果您所说的“二进制”是指 BinaryFormatter,那么它在版本之间已经是非常不能容忍的,因为它严格依赖于类型元数据(除非您非常努力地使用自定义绑定(bind))。因此,只有当两端都使用完全相同的实现时,它才严格可靠。即使将属性更改为自动实现的属性或从自动实现的属性更改属性也是一个重大更改。

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

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

关于c# - 对象可以跨不同的框架版本序列化/反序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9231949/

相关文章:

c# - 在 WPF 中,创建类似于 Outlook 2007 的日历 View 的最佳方法是什么?

c# - Entity Framework 中的 POCO 支持

c# - 在方法中声明类或结构

c# - 在大型应用程序中使用 MVVM - 共享 View 模型、模型、状态等

c# - 哪个更快更有效——begininvoke 还是 synchronisecontext.post?

c# - ConcurrentDictionary.GetOrAdd() : valueFactory with different signature

c# - ASP.NET C# 在 SQL Server 数据库表中搜索

c# - 在年龄限制的 Facebook 粉丝页面上使用 cron 作业获取信息

c# - 强制转换并转换为基类对象的集合不起作用

c# - 将 Powershell 窗口的输出提取到字符串