协议缓冲区与JSON或BSON

Jef*_*ang 90 c# comparison json protocol-buffers bson

有没有人有关于协议缓冲区与BSON(二进制JSON)或一般JSON的性能特征的任何信息?

  • 电线尺寸
  • 序列化速度
  • 反序列化速度

这些似乎是用于HTTP的良好二进制协议.我只是想知道从长远来看哪个C#环境会更好.

这是我在BSONProtocol Buffers上阅读的一些信息.

Mic*_*ene 64

Thrift也是另一种类似协议缓冲区的替代方案.

Java社区有关于序列化/反序列化以及这些技术的线大小的良好基准:https: //github.com/eishay/jvm-serializers/wiki

一般来说,JSON的线径略大,DeSer稍差,但无处不在,并且无需源IDL即可轻松解读.最后一点是Apache Avro试图解决的问题,它在性能方面都有所优势.

微软已经发布了一个C#NuGet包Microsoft.Hadoop.Avro.


myt*_*thz 50

以下是一些最新的基准测试,显示了流行的.NET Serializers的性能.

燃烧的和尚基准测试显示序列化一个简单的POCO的性能,同时全面罗斯文基准测试显示,微软的罗斯文数据集的每个表序列化行的综合结果.

在此输入图像描述

基本上,协议缓冲区(protobuf-net)比.NET中最快的基类库Serializer(XML DataContractSerializer)快约7倍.它也比因为它也竞争较小的2.2倍比微软最紧凑的序列化格式(JsonDataContractSerializer)小.

ServiceStack的Text序列化程序最接近匹配二进制protobuf-net的性能,其中Json Serializer仅比protobuf-net慢2.58倍.


Has*_*yed 22

协议缓冲区是为电线设计的:

  1. 非常小的消息大小 - 一个方面是非常有效的可变大小的整数表示.
  2. 非常快速的解码 - 它是一种二进制协议.
  3. protobuf生成超高效的C++用于编码和解码消息 - 提示:如果将所有var-integer或静态大小的项编码到其中,它将以确定的速度进行编码和解码.
  4. 它提供了非常丰富的数据模型 - 有效地编码非常复杂的数据结构.

JSON只是文本,需要进行解析.提示:将"十亿"int编码到其中会占用相当多的字符:Billion = 12 char(长规模),二进制它适合uint32_t现在尝试编码双精度怎么样?那会更糟糕.

  • 但是,它确实存在不处理继承的相当不幸的缺点,虽然组合是一种有效的替代方案,但我不希望我的数据传输对象强制使用组合而不是继承. (4认同)
  • 我相信Extensions的使用方式与继承非常相似... https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#extension (4认同)