阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

Google 发布新版本的 Protocol Buffers

  • 2009-05-21
  • 本文字数:1281 字

    阅读完需:约 4 分钟

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

2009-05-21 20:414328
用户头像

发布了 133 篇内容, 共 35.0 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

TCP/IP参考模型与标准协议

Regan Yue

TCP/IP 9月日更

手机测试岗位常见面试问题汇总(持续更新中)

IT蜗壳-Tango

9月日更

架构设计的一些思考

hasWhere

古董系统的并发安全改造

hasWhere

高可用延迟队列设计与实现

万俊峰Kevin

微服务 延迟队列 microservice Go 语言 定时队列

模块八作业

河马先生

架构实战营

产品分析:如何给出解决方案?

石云升

产品经理 产品思维 9月日更

过滤器、拦截器、监听器

hasWhere

模块四作业

Geek_fc100d

「架构实战营」

Vue进阶(幺贰肆):前端用户体验提升(一)

No Silver Bullet

用户体验 9月日更

【架构设计模块八】:设计消息队列存储消息数据的 MySQL 表格

Ryoma

Ember.js 项目开发之 Ember Data

devpoint

ember.js 9月日更

中秋晴朗夜,我们与星月相见

白洞计划

Elasticsearch 源码学习(1)源码编译调试

Se7en

技术圈的【多肉小达人】,一篇文章你就能做到

梦想橡皮擦

9月日更

架构实战营模块8作业

zlz

网络攻防学习笔记 Day143

穿过生命散发芬芳

9月日更 虚拟化技术

python学习笔记:day1——python入门了解

秦时明月

Python编程

缓存系统设计与实现

hasWhere

SpringMVC源码分析-HandlerAdapter(2)-RequestMappingHandlerAdapter的初始化

Brave

源码 springmvc 9月日更

模块8作业

脉动

架构实战营-模块八作业

以吻封笺

数据仓库的数据从哪来?

奔向架构师

数据仓库 9月日更

JVM启动参数学习笔记三

风翱

JVM 9月日更

【LeetCode】最后一个单词的长度Java题解

Albert

算法 LeetCode 9月日更

架构训练营-模块八作业

hello

架构训练营

架构训练营模块八作业

喻高咏        

架构训练营

JavaScript进阶(六)继承

Augus

JavaScript 9月日更

架构实战营-模块八作业

老实人Honey

《转》搭建websocket消息推送服务

hasWhere

架构实战营模块八作业

技术是伙伴

架构实战营

Google发布新版本的Protocol Buffers_SOA_Dilip Krishnan_InfoQ精选文章