C# 协议缓冲区与JSON或BSON

C# 协议缓冲区与JSON或BSON,c#,json,comparison,protocol-buffers,bson,C#,Json,Comparison,Protocol Buffers,Bson,有人知道协议缓冲区相对于BSON(二进制JSON)或相对于JSON的性能特征吗 导线尺寸 序列化速度 反序列化速度 这些似乎是通过HTTP使用的好的二进制协议。我只是想知道从长远来看,对于C#环境来说,哪一个更好 以下是我正在阅读的一些信息。协议缓冲区是为有线电视设计的: 非常小的消息大小-一个方面是非常有效的可变大小整数表示 非常快的解码-这是一个二进制协议 原型Bufff生成了用于编码和解码消息的超高效C++——提示:如果将所有VAR整数或静态大小的条目编码到它中,它将以确定的速度编码和

有人知道协议缓冲区相对于BSON(二进制JSON)或相对于JSON的性能特征吗

  • 导线尺寸
  • 序列化速度
  • 反序列化速度
这些似乎是通过HTTP使用的好的二进制协议。我只是想知道从长远来看,对于C#环境来说,哪一个更好


以下是我正在阅读的一些信息。

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

  • 非常小的消息大小-一个方面是非常有效的可变大小整数表示
  • 非常快的解码-这是一个二进制协议
  • 原型Bufff生成了用于编码和解码消息的超高效C++——提示:如果将所有VAR整数或静态大小的条目编码到它中,它将以确定的速度编码和解码。
  • 它提供了一个非常丰富的数据模型——有效地编码非常复杂的数据结构
  • JSON只是文本,需要进行解析。提示:将一个“十亿”整数编码到其中需要相当多的字符:十亿=12个字符(长刻度),在二进制中它适合uint32\t现在尝试编码一个双精度整数怎么样?那将更糟糕

    也是另一种类似缓冲区的协议

    Java社区提供了关于这些技术的序列化/反序列化和连线大小的良好基准:

    一般来说,JSON具有稍大的连接大小和稍差的DESR,但在普遍性和无需源IDL即可轻松解释的能力方面获胜。最后一点是要解决的问题,它在性能方面胜过了两者

    微软发布了一个C#NuGet包。

    比较了.NET中的序列化速度和大小,包括JSON、BSON和XML

    这里展示了流行的.NET序列化程序的性能

    显示序列化简单POCO的性能,而综合显示序列化Microsoft Northwind数据集每个表中的行的综合结果

    基本上,协议缓冲区()比.NET中最快的基类库序列化程序(XML DataContractSerializer)快7倍左右。它也比竞争对手小,因为它比微软最紧凑的序列化格式(JsonDataContractSerializer)小2.2x


    ServiceStack的文本序列化程序最接近于二进制protobuf网络的性能,其速度仅比protobuf网络慢2.58x

    小消息大小不会自动转换为快速性能,请参阅本文良好链接;我唯一不确定的是关于Avro的评论——虽然它可以更有效地用于其核心用例(大量类似的数据条目),但在这个基准测试(测试单个请求的处理)中,它的性能似乎不是很快。。。。我更喜欢“SeDes:)但是,它确实有不处理继承的不幸缺点,虽然合成是一种有效的替代方法,但我不喜欢被我的数据传输对象强迫使用合成而不是继承。我相信扩展可以以非常类似于继承的方式使用。。。是的,扩展是一个很好的观点。我每天都在工作实践中使用它。“协议缓冲区是为电线设计的”什么是“电线”?@marcospgp
    wire
    的意思就是网络。现在,当我们使用如此多的无线网络时,听起来可能很奇怪。一些人认为(我认为这包括一位前protobuf作者)使用更大但更便宜的格式进行序列化,然后使用快速标准压缩器压缩输出,这是一个更好的主意。我认为在问题本身提出某种比较方法之前,不应该重新打开该方法(否则这是为了进行更为固执己见的讨论/过于广泛)也许更多的是关于每种格式的优点和缺点,答案可能包括一个决策树。很棒的帖子-但是如果可能的话,你应该在显示平均值的条形图上标出错误条。为什么测试中不包括JIL?(你知道为什么吗?)这个答案没有关于协议缓冲区的信息。