thrift和google protobuffer各有什么优劣

数据类型

protobuf优缺点 protobuf详解protobuf优缺点 protobuf详解


protobuf优缺点 protobuf详解


protobuf

thrift

protobuf

thrift

protobuf

thrift

protobuf

thrift

double

double

float

byte

i16

int32

i32

int64

i64

uint32

uint64

sint32

sint64

fixed32

fixed64

sfixed32

sfixed64

bool

bool

string

string

bytes

binary

message

struct

enum

enum

serv

serv

综合对比

protobuf

thrift

功能特性

主要是一种序列化机制

提供了RPC解决方案,包括序列化机制、传输层、并发处理框架等

支持语言

C++/Ja/Python

C++, Ja, Python, Ruby, Perl, PHP, C#, Erlang, Haskell

易用性

语法类似,使用方式等类似

生成代码的质量

可读性都还过得去,执行效率另测

升级时版本兼容性

均支持向后兼容和向前兼容

学习成本

功能单一,容易学习

功能丰富、学习成本高

文档&社区

文档较为丰富,google搜索protocol buffer有2000W+结果,google group被墙不能访问

文档较少,没有API文档,google搜索apache thrift仅40W结果,邮件列表不怎么活跃

性能对比

由于thrift功能较protobuf丰富,因此单从序列化机制上进行性能比较,按照序列化后字节数、序列化时间、反序列化时间三个指标进行,对thrift的二进制、压缩、protobuf三种格式进行对比。

测试方法:取了15000+条样本数据,分别写了三个指标的测试程序,在我自己的电脑上执行,其中时间测试循环1000次,总的序列化/反序列化次数1500W+。

平均字节数:

thrift二进制

535

thrift压缩

473

protobuf

477

序列化(1500W次)时间(ms):

thrift二进制

306034

thrift压缩

304256

protobuf

177652

反序列化(1500W次)时间(ms):

thrift二进制

287972

thrift压缩

3159

protobuf

157192

thrift的时间测试可能不是很准,由于thrift产生代码的复杂性,编写的测试代码为了适应其接口,在调用堆栈上可能有一些额外开销。

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Ja, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

thrift和google protobuffer各有什么优劣

Google放出来了Protocol buffers,一种用来部分替代xml的数据描述语言。Google就是Google,就算是推白菜出来,也一样能让人侧目。其实protocol buffers也不是什么新鲜的概念,且不说传统的ASN.1, ICE这些有点类似的东西,facebook一年前就推出了thrift,应该说定位是非常的接近的。也有谣传说是先有了protocol buffers在google内部流行,然后google的人跳槽到facebook,就出了thrift这个东西……呵呵,停止八卦,言归正传。 观察法看到的优缺点 Thrift: 支持的语言更广泛一些c++, ja, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php, squeak(真够的) protobuf 目前还是只支持c++, ja, python, 其他语言有待开发. Thrift提供的功能更丰富一些: Thrift提供了简单的RPC构架(其实不简单了, block, nonblock的都有了…..) protobuf好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。 Thrift支持多种协议格式. Thrift的代码实现,有专门的TProtocol和TTransport抽象,相互配合,可以实现多种协议,方便集成各种传输方式。至少目前Thrift就能使用json作为序列化协议。 protobuf好像只安心一种协议,并下决心把这个格式做好。输入输出也是标准的stream. 认真的说也不完全这样,protobuf为了调试方便,也提供了Text_Fromat功能,这个也算一个nonbinary格式支持,这样看来完全新协议还是有可能的。 Thrift还提供了不少语言的C module(性能啊,都是性能啊) protobuf全部pure language实现, 反正现在已经都5到10倍速度了,不在乎了….. thrift目前不支持Windows平台,至少c++语言的runtime library和generated code是不不能在windows平台上使用的。(这真有点让人难以接受啊,现代科技这么发达,还有怪兽boost,支持windows有这么难吗?) protobuf没有这个问题,提供了visual studio的项目文件,可以很顺利的在windows平台下编译。(题外话: 如果不知道googletest怎么在windows平台上使用,可以参考protobuf的测试用例)。 The Thrift C++ runtime library does not currently work on Windows. This means that you’ll be able to compile ThriftIDL files to C++/Ja/Python/etc., but you won’t be able to compile and run the generated C++ code under Windows. thrift wiki protobuf侧重点是语言表达,同时在存储效率上也下了不少功夫。用protobuf来直接读写数据结构相当的方便。 thrift侧重点是构建夸语言的可伸缩的服务,特点就是支持的语言多,同时提供了完整的rpc serv framework,可以很方便的直接构建服务,不需要做太多其他的工作。 数据类型相对固定的情况下,不论是thrift还是protobuf都会比直接处理xml要方便很多。不管是dom还是类sax,总没有直接出数据结构访问来的方便啊。

ja序列化Protostuff和Serializable的区别

序列化就是将Ja Object转成byte[];反序列化就是将byte[]转成Ja Object。

Ja自带序列化机制ja.io.Serializable

标识一个对象需要系列化,该对象类型需要实现 Serializable 接口。

1,序列化的类型和反序列化的类型的序列化ID必须一致(远程信息交换时)。

2,静态数据不会被序列化,Transient关键字修饰的字段不会被序列化。

3,对象序列化存储时,两次存储相同值对象会有优化(第二次对象写入会只存储引用)。

Protostuff是一个序列化库,支持一下序列化格式:

protobuf

protostuff (native)

graph (protostuff with support for cyclic references. See Serializing Object Graphs)

json

ile (binary json useable from the protostuff-json module)

xml

yaml (serialization only)

kvp (binary uwsgi header)

序列化

@SuppressWarnings("unchecked")

public static byte[] serialize(T obj) {

Class cls = (Class) obj.getClass();//获得对象的类;

LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);//使用LinkedBuffer分配一块默认大小的buffer空间;

try {

Schema schema = getSchema(cls);//通过对象的类构建对应的schema;

return ProtostuffIOUtil.toByteArray(obj, schema, buffer);//使用给定的schema将对象序列化为一个byte数组,并返回。

} catch (Exception e) {

throw new IllegalStateException(e.getMessage(), e);

} finally {

buffer.clear();

}}

反序列化

public static T deserialize(byte[] data, Class cls) {

try {

T message = objenesis.newInstance(cls);//使用objenesis实例化一个类的对象;

Schema schema = getSchema(cls);//通过对象的类构建对应的schema;

ProtostuffIOUtil.mergeFrom(data, message, schema);//使用给定的schema将byte数组和对象合并,并返回。

return message;

} catch (Exception e) {

throw new IllegalStateException(e.getMessage(), e);

}}

优缺点比较:

优点 缺点

Serializable 使用方便,可序列化所有类 速度慢,占空间

Protostuff 速度快,基于protobuf 需静态编译

mapreduce是否可以不依赖hadoop

使用hadoop时,我们有时会自写一些mapreduce的应用,我们可能会用到一些第三方的包。如果不做任何处理,在job执行的就会报ClassNotFound的Exception.

thrift和google protobuffer各有什么优劣

Google就是Google,就算是推白菜出来,也一样能让人侧目。其实protocol buffers也不是什么新鲜的概念,且不说传统的ASN.1, ICE这些有点类似的东西,facebook一年前就推出了thrift,应该说定位是非常的接近的。也有谣传说是先有了protocol buffers在google内部流行,然后google的人跳槽到facebook,就出了thrift这个东西……呵呵,停止八卦,言归正传。 观察法看到的优缺点 Thrift: 支持的语言更广泛一些c++, ja, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php, squeak(真够的) protobuf 目前还是只支持c++, ja, python, 其他语言有待开发. Thrift提供的功能更丰富一些: Thrift提供了简单的RPC构架(其实不简单了, block, nonblock的都有了…..) protobuf好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。 Thrift支持多种协议格式. Thrift的代码实现,有专门的TProtocol和TTransport抽象,相互配合,可以实现多种协议,方便集成各种传输方式。至少目前Thrift就能使用json作为序列化协议。 protobuf好像只安心一种协议,并下决心把这个格式做好。输入输出也是标准的stream. 认真的说也不完全这样,protobuf为了调试方便,也提供了Text_Fromat功能,这个也算一个nonbinary格式支持,这样看来完全新协议还是有可能的。 Thrift还提供了不少语言的C module(性能啊,都是性能啊) protobuf全部pure language实现, 反正现在已经都5到10倍速度了,不在乎了….. thrift目前不支持Windows平台,至少c++语言的runtime library和generated code是不不能在windows平台上使用的。(这真有点让人难以接受啊,现代科技这么发达,还有怪兽boost,支持windows有这么难吗?) protobuf没有这个问题,提供了visual studio的项目文件,可以很顺利的在windows平台下编译。(题外话: 如果不知道googletest怎么在windows平台上使用,可以参考protobuf的测试用例)。 The Thrift C++ runtime library does not currently work on Windows. This means that you’ll be able to compile ThriftIDL files to C++/Ja/Python/etc., but you won’t be able to compile and run the generated C++ code under Windows. thrift wiki protobuf侧重点是语言表达,同时在存储效率上也下了不少功夫。用protobuf来直接读写数据结构相当的方便。 thrift侧重点是构建夸语言的可伸缩的服务,特点就是支持的语言多,同时提供了完整的rpc serv framework,可以很方便的直接构建服务,不需要做太多其他的工作。 数据类型相对固定的情况下,不论是thrift还是protobuf都会比直接处理xml要方便很多。不管是dom还是类sax,总没有直接出数据结构访问来的方便啊

ja序列化Protostuff和Serializable的区别

序列化就是将Ja Object转成byte[];反序列化就是将byte[]转成Ja Object。

Ja自带序列化机制ja.io.Serializable

标识一个对象需要系列化,该对象类型需要实现 Serializable 接口。

1,序列化的类型和反序列化的类型的序列化ID必须一致(远程信息交换时)。

2,静态数据不会被序列化,Transient关键字修饰的字段不会被序列化。

3,对象序列化存储时,两次存储相同值对象会有优化(第二次对象写入会只存储引用)。

Protostuff是一个序列化库,支持一下序列化格式:

protobuf

protostuff (native)

graph (protostuff with support for cyclic references. See Serializing Object Graphs)

json

ile (binary json useable from the protostuff-json module)

xml

yaml (serialization only)

kvp (binary uwsgi header)

序列化

@SuppressWarnings("unchecked")

public static byte[] serialize(T obj) {

Class cls = (Class) obj.getClass();//获得对象的类;

LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);//使用LinkedBuffer分配一块默认大小的buffer空间;

try {

Schema schema = getSchema(cls);//通过对象的类构建对应的schema;

return ProtostuffIOUtil.toByteArray(obj, schema, buffer);//使用给定的schema将对象序列化为一个byte数组,并返回。

} catch (Exception e) {

throw new IllegalStateException(e.getMessage(), e);

} finally {

buffer.clear();

}}

反序列化

public static T deserialize(byte[] data, Class cls) {

try {

T message = objenesis.newInstance(cls);//使用objenesis实例化一个类的对象;

Schema schema = getSchema(cls);//通过对象的类构建对应的schema;

ProtostuffIOUtil.mergeFrom(data, message, schema);//使用给定的schema将byte数组和对象合并,并返回。

return message;

} catch (Exception e) {

throw new IllegalStateException(e.getMessage(), e);

}}

优缺点比较:

优点 缺点

Serializable 使用方便,可序列化所有类 速度慢,占空间

Protostuff 速度快,基于protobuf 需静态编译