写点什么

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:414429
用户头像

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

关注

评论

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

openEuler22+GreatSQL+dbops玩转MGR

GreatSQL

MySQL 高可用 greatsql greatsql社区

深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等

汀丶人工智能

人工智能 深度学习 计算机视觉 语义分割算法 6 月 优质更文活动

2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度

福大大架构师每日一题

算法 福大大

Vue安装并使用axios发送请求

不觉心动

6 月 优质更文活动

浅谈中小企业如何选择适合自己的网络营销方式

石头IT视角

SaaS公司如何成为 AI 独角兽?发挥长板:流程、用户需求和数据积累

B Impact

【Netty】「NIO」(五)多线程优化

sidiot

Java 后端 Netty 6 月 优质更文活动

《弥合鸿沟——2023校园招聘调研报告&备战攻略》重磅发布!一文速览10大关键发现

用友BIP

招聘 人才 校招

节省90%编译时间,这是字节跳动开源的基于Rust的前端构建工具

字节跳动技术范儿

rust 前端 前端构建

HAG:首个通过合规STO将RWA通证化应用于比特币Mining的项目

股市老人

Redis.confp配置文件的一些配置

不觉心动

6 月 优质更文活动

RabbitMQ工作模式总结

不觉心动

6 月 优质更文活动

SpringBoot整合RabbitMQ生产者

不觉心动

6 月 优质更文活动

聊聊那些奇葩的代码规范 —— 滥用静态导入

HoneyMoose

SpringBoot项目使用hutool工具进行HttpClient接口调用的处理(文件上传)

不觉心动

6 月 优质更文活动

使用SpringBoot整合数据库连接池Druid的错误总结

不觉心动

6 月 优质更文活动

Redis的发布订阅

不觉心动

6 月 优质更文活动

RabbitMQ工作模式 Pub/Sub订阅模式

不觉心动

6 月 优质更文活动

ESP8266调用NTP服务器进行时间校准

DS小龙哥

6 月 优质更文活动

npm安装nanoid生成随机id并简单使用

不觉心动

6 月 优质更文活动

解决vue组件终端报错: error Component name “xxx“ should always be multi-word vue/multi-word

不觉心动

6 月 优质更文活动

RabbitMQ工作模式之Work queues工作队列模式

不觉心动

6 月 优质更文活动

RabbitMQ工作模式 Routing路由模式

不觉心动

6 月 优质更文活动

新斗罗大陆游戏详细图文架设教程

echeverra

斗罗大陆

Go 空结构体:零内存的魔力

陈明勇

Go golang 空结构体 6 月 优质更文活动

Pilota:为什么一个代码生成工具如此复杂丨GOTC Rust系列分享

字节跳动技术范儿

rust GOTC

解决SpringBoot整合Mybatis和Mybatis-Plus不能公用(版本兼容性问题)

不觉心动

6 月 优质更文活动

常见的软件可靠性度量和分析方法

穿过生命散发芬芳

可靠性度量 6 月 优质更文活动

C语言编程—头文件

芯动大师

C语言 头文件 6 月 优质更文活动

Vue使用axios进行get请求拼接参数的两种方式

不觉心动

6 月 优质更文活动

Springboot整合RabbitMQ生产端和消费端

不觉心动

6 月 优质更文活动

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