【发布时间】:2015-03-30 19:57:57
【问题描述】:
所以在我见过的许多基准测试中,protobuf-net 远远领先于 BinaryFormatter: - http://theburningmonk.com/2011/08/performance-test-binaryformatter-vs-protobuf-net/ - https://code.google.com/p/protobuf-net/wiki/Performance
这让我想到了一个问题:如果 protobuf-net 可用,为什么要使用 BinaryFormatter?
我读过一些关于 BinaryFormatter 存储类型元数据的内容,这是 protobuf 不做的。你能给我一个我希望存储类型元数据的示例场景吗?
【问题讨论】:
-
我已经看到了这个问题;我只是不知道我想选择
BinaryFormatter的任何场景;p -
-
抱歉无法完成评论(已超过最大延迟)。该测试正在序列化“100,000 个相同的实例”,因此 BinaryFormatter 存储 1 个数据和 100K 引用。另一方面,protobuf 完全存储数据的副本。该测试不能代表 protobuf 的强大功能,因为我们永远不需要发送 100 K 相同的记录,我将这个测试称为“不公平”。 :)
-
无法比较那些序列化程序。 protobuf 不支持循环对象图(引用),仅使用有向图的现代趋势来自非同质系统中的数据编组需求。 protobuf 就是为此而构建的,就像 Thrift 和许多其他人一样。 BinFrmtr 是一个“透明”的 CLR 图 serlzr,在许多类集群系统中都需要它,在这些系统中,为了提高性能而需要在集群中分布本地 CLR 对象,并且不需要对象可移植性。但请记住,BinFormtr 非常慢,但也不必如此。还有 NFX Slim 等替代品
-
无论如何,BinFmter(等等)都有一个强大的用例。集群系统非常需要在机器之间分散负载,因为需要“移动”一些数据。有时仅创建 DTO(数据传输对象)来移动数据非常不方便,因为许多“鸭子打字”语言支持者讨厌“经典 OOP”语言——“垃圾 DTO 类型”的扩散。在大多数情况下,本机 CLR 对象序列化器允许为了业务逻辑的目的重用已经存在的现有对象。在下面添加了 NFX Slim Serializer 的链接,速度更快
标签: c# performance serialization protobuf-net binaryformatter