Apache Thrift和谷歌的协议缓冲区最大的优点和缺点是什么?
当前回答
ProtocolBuffers是fast。 这里有一个很好的基准: https://github.com/eishay/jvm-serializers/wiki(最后一次更新是2016年,但到2020年,已经有包含更快序列化器的fork,例如ActiveJ创建了一个fork来演示它们在JVM上的速度:https://github.com/activej/jvm-serializers)。
你可能还想看看Avro,它速度更快。在。net中有两个用于Avro的库:
Apache。Avro 空空的。由供应链物流公司C.H. Robinson的工程师编写
顺便说一下,我见过最快的是captain 'nProto; c#实现可以在Marc Gravell的Github-repository中找到。
其他回答
一个尚未提到的明显的事情是,它们既可以是赞成的,也可以是反对的(两者都是一样的),它们是二进制协议。这允许更紧凑的表示和可能更好的性能(优点),但降低了可读性(或更确切地说,可调试性),这是一个缺点。
此外,两者对工具的支持都比xml(甚至json)等标准格式少一些。
(编辑)这里有一个有趣的比较,解决了大小和性能的差异,并包括一些其他格式(xml, json)的数字。
我认为大多数观点都忽略了一个基本事实,那就是Thrift是一个RPC框架,它恰好能够使用各种方法(二进制、XML等)序列化数据。
协议缓冲区是纯粹为序列化而设计的,它不像Thrift那样是一个框架。
我认为基本的数据结构是不同的
协议缓冲区使用变长整数,即变长数字编码,将固定长度的数字转换为变长数字以节省空间。 Thrift提出了不同类型的序列化格式(称为“协议”)。 事实上,Thrift有两种不同的JSON编码和不少于三种不同的二进制编码方法。
总之,这两个库是完全不同的。Thrift喜欢一站式服务,为您提供完整的集成RPC框架和许多选项(支持跨语言),而Protocol Buffers更倾向于“只做一件事并做好它”。
另一个重要的区别是默认支持的语言。
协议缓冲区:Java, Android Java, c++, Python, Ruby, c#, Go, Objective-C, Node.js 节俭:Java、c++、Python、Ruby、c#、Go、Objective-C、JavaScript、Node.js、Erlang、PHP、Perl、Haskell、Smalltalk、OCaml、Delphi、D、Haxe
两者都可以扩展到其他平台,但这些都是现成的语言绑定。
根据维基百科的说法,Thrift运行时不能在Windows上运行。
推荐文章
- 如何JSON序列化集?
- 如何将TimeSpan序列化为XML
- 如何在Intellij生成串行版本UID
- 在Go中使用JSON Marshal的小写JSON键名
- 什么是序列化?
- 我如何复制一个哈希在Ruby?
- 为什么生成较长的serialVersionUID而不是简单的1L?
- 将流转换为字符串并返回
- Parcelable遇到IOException写入序列化对象getactivity()
- 谷歌协议缓冲区vs json vs XML
- 不带空格的Python - json
- 打印对象的所有属性
- 在Swift中将字典转换为JSON
- 将类实例序列化为JSON
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时