BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Google发布新版本的Protocol Buffers

| 作者 Dilip Krishnan 关注 0 他的粉丝 ,译者 黄璜 关注 0 他的粉丝 发布于 2009年5月22日. 估计阅读时间: 5 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

Google发布了新版本的protocol buffers-一种可扩展的序列化结构化数据的方式,语言中立,平台中立并被用于通信协议,数据存储等许多方面。这一版本的变更在变更记录里进行了概要描述。

protocol buffers是一个灵活的,高效的,用于序列化结构化数据的自动机制-想想XML,但更小巧,快捷和简单。你只需要一次性定义好你希望数据如何被组织,然后你可以用特别生成的源代码使用各种各样的语言方便地对多种多样的数据流进行读和写。你甚至可以在不破坏以“旧”格式编译的已部署的程序的情况下,更新你的数据结构。

发布的文档来看;常见的跨进程/机器界线序列化对象的技术有:

  • 本地序列化,以所使用语言比如Java,C++等等的本地实现来序列化对象
  • 使用自定义的序列化格式来进行序列化
  • 将数据序列化为XML

这些方案每个都有其自身的问题存在,比如本地序列化意味着在序列化管道的末端必须是同样的平台,以保证能实体化序列化的对象,XML被认为是一种冗长而效率低下的序列化格式,而自定义序列化格式会因开发一次性的语法分析器而带来成本的增加。

Protocol buffers的目标就是针对这一问题的灵活,高效而自动的解决方案。利用protocol buffers,你对需要存储的数据结构编写一个.proto描述文件。Protocol buffer编译器据此创建一个实现自动编码的类并且以一种高效的二进制格式来分析protocol buffer数据。所生成的类为组成protocol buffer的字段提供了getter和setter,并且处理了将这一protocol buffer作为单元来读取和写入的细节.更重要的是,protocol buffer格式支持随着时间对格式进行扩展的概念,以这种方式代码仍然可以读取以旧格式编码的数据。

Protocol buffers支持如下的可以被“对象”图表达的基本数据类型

  • 基本的128 Varint表示-int32,int64,uint32,uint64,sint32,sint64,bool,enum(Varints是使用一个或多个字节来序列化整数的一种方法。小的数值占用更小的字节。)
  • 固定大小的64位表示-fixed64,sfixed64,double
  • 固定大小的表示-string,bytes,嵌入消息,打包的重复字段
  • 固定大小的32位表示-fixed32,sfixed32,float

一个序列化单元是一条包含由基本数据类型或嵌入消息所组成字段的消息。Protocol buffers支持可选的,必需的和重复的字段。一个使用protocol buffers来定义的地址簿消息看起来可能像这样

package tutorial;

message Person {
 required string name = 1;
 required int32 id = 2;
 optional string email = 3;

 enum PhoneType {
 MOBILE = 0;
 HOME = 1;
 WORK = 2;
 }

 message PhoneNumber {
 required string number = 1;
 optional PhoneType type = 2 [default = HOME];
 }

 repeated PhoneNumber phone = 4;
}

message AddressBook {
 repeated Person person = 1;
}

消息定义语言的特性在语言指南里面作出了描述。当使用protocol buffer编译器进行编译时,编码器和语法分析器用一种私有的高效序列化格式产生。当前的发布版包括了编译器以及用于C++,Java和Pyhon的API。同时还有社区项目力图为Protocol Buffers加入新的语言实现,包括Perl,C#,以及Ruby。

查看英文原文:Google Releases New Version Of Protocol Buffers

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

好东西 by zhao joyous

好东西,我自己实现了一个文件型的缓冲,是直接把对象序列化到硬盘上的,上次对那个类的基类升级以后,所有的缓冲文件都不能用了..这是个很麻烦的事..也许protocol buffers是解决这个问题的思路.

和JSON有什么区别? by a ilangg

除了里面的可选字段、枚举类型?

Re: 和JSON有什么区别? by lee steeven

效率啊,那是相当的高。Json啊,那是文本的

好吧,那和ASN.1有什么区别? by Seven GlacJAY

rt

向前兼容性 by Wang Frank

"protocol buffer格式支持随着时间对格式进行扩展的概念,以这种方式代码仍然可以读取以旧格式编码的数据。"
这个是使用的基础吧

Re: 向前兼容性 by lee luke

是向后兼容(即向老版本兼容,向前兼容是对未来版本的兼容),修改后的版本,可以兼容以前的老版本。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

6 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT