Apache Thrift和谷歌的协议缓冲区最大的优点和缺点是什么?
当前回答
我认为大多数观点都忽略了一个基本事实,那就是Thrift是一个RPC框架,它恰好能够使用各种方法(二进制、XML等)序列化数据。
协议缓冲区是纯粹为序列化而设计的,它不像Thrift那样是一个框架。
其他回答
它们都提供了许多相同的功能;然而,有一些不同之处:
节俭支持“例外” 协议缓冲区有更好的文档/示例 Thrift有一个内置的Set类型 协议缓冲区允许“扩展”——你可以扩展一个外部原型来添加额外的字段,同时仍然允许外部代码对这些值进行操作。在节俭中没有办法做到这一点 我发现协议缓冲区更容易阅读
基本上,它们是相当等效的(从我读到的内容来看,协议缓冲区的效率略高)。
首先,protobuf并不是一个完整的RPC实现。它需要像gRPC这样的东西来配合。
与Thrift相比,gPRC非常慢:
http://szelei.me/rpc-benchmark-part1/
根据维基百科的说法,Thrift运行时不能在Windows上运行。
同样重要的是要注意,并非所有受支持的语言都与thrift或protobuf一致。在这一点上,除了底层序列化之外,还涉及到模块实现的问题。注意检查您计划使用的语言的基准。
Protobuf序列化对象大约比Thrift小30%。 你可能想用protobuf对象做的大多数操作(创建、序列化、反序列化)都比thrift慢得多,除非你打开optimize_for = SPEED选项。 Thrift具有更丰富的数据结构(Map, Set) Protobuf API看起来更干净,尽管生成的类都打包为内部类,这不是很好。 节俭枚举不是真正的Java枚举,也就是说,它们只是整数。Protobuf有真正的Java枚举。
要进一步了解差异,请查看这个开放源代码项目的源代码差异。
推荐文章
- 如何将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,当只对类而不是对象调用闭包外部的函数时
- 在JSON中什么是反序列化和序列化?