RPC 序列化工具Protobuf介绍

   Google Protocol Buffers(Protobuf)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。buffers和mxl一样在序列化数据结构时很灵活、高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单。目前提供了 C++、Java、Python 三种语言的 API。

托管源码:https://github.com/google/protobuf/

下载地址:http://code.google.com/p/protobuf/downloads/list
官方文档:
开发指南:https://code.google.com/apis/protocolbuffers/docs/overview.html
java使用说明:https://developers.google.com/protocol-buffers/docs/javatutorial(中文参考:http://www.cppblog.com/woaidongmao/archive/2009/06/23/88391.html
协议说明:http://code.google.com/apis/protocolbuffers/docs/proto.html
参考文档:
Protocol Buffer技术详解(语言规范) :http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html

1.Protobuf安装
下载Protobuf:http://code.google.com/p/protobuf/downloads/list
目前最新是Protobuf 2.5.0版本. 如果是Windows系统,可直接下载win32, 解压出protoc.exe到任意目录.Linux系统下载后还需要自行编译。
tar zxvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/usr/local/protobuf
make
make check
make install
如果编译出错,自行解决,直到安装成功.
$protoc --version
libprotoc 2.5.0
2.Protobuf消息定义,数据类型
完整的Protobuf数据类型参考:http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html
3.Protobuf的简单使用
定义一个消息的协议,如下协议,命名为user.proto

option java_package = "cn.slimsmart.protoc.demo";
option java_outer_classname = "User";
message UserInfo{
	required string  id= 1 ;
	required string name= 2 [default = "Jack"];
	required int32 age = 3 [default = 20];
	optional string desc = 4;
}
java_package  java包路径
java_outer_classname java类型
message 定义类及属性
用protoc生成各种语言的消息实体.如Java:
>protoc.exe --java_out=./ user.proto
在当前目录下生成cn/slimsmart/protoc/demo/User.java
工程引入依赖jar包:

<dependency>
			<groupId>com.google.protobuf</groupId>
			<artifactId>protobuf-java</artifactId>
			<version>2.6.1</version>
		</dependency>
4.序列化测试

package cn.slimsmart.protoc.demo;
public class Test {
	public static void main(String[] args) {
		User.UserInfo.Builder builder =User.UserInfo.newBuilder();
		builder.setId("699B599EF7E44EEFA0B9A659A03CD159");
		builder.setAge(55);
		builder.setName("lucy");
		builder.setDesc("hello world");
		User.UserInfo userinfo = builder.build();
		System.out.println(userinfo.toString());
		System.out.println(userinfo.toByteString().toStringUtf8());
	}
}
Protobuf 的优点
Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
它有一个非常棒的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。这样您的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题。因为添加新的消息中的 field 并不会引起已经发布的程序的任何改变。
Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。
使用 Protobuf 无需学习复杂的文档对象模型,Protobuf 的编程模式比较友好,简单易学,同时它拥有良好的文档和示例,对于喜欢简单事物的人们而言,Protobuf 比其他的技术更加有吸引力。
Protobuf 的不足
Protbuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念。
XML 已经成为多种行业标准的编写工具,Protobuf 只是 Google 公司内部使用的工具,在通用性上还差很多。
由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上 Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容。

参考:

Google Protocol Buffer 的使用和原理

各种序列化工具测试比较

几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值