1 protobuf概述

1 protobuf概述

本教程基本上时官方教程的翻译

1.1 是什么

Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议数据存储等领域。

1.2 为什么用

  • 平台无关,语言无关,可扩展;
  • 提供了友好的动态库,使用简单;
  • 解析速度快,比对应的XML快约20-100倍;
  • 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

1.3 跨语言兼容性

可以使用一个jave程序序列化数据发送给python程序解析

1.4 向前向后兼容新

按照规则进行升级proto后(规则在后面proto3语言指南中由描述),旧的代码可以读取新的消息,忽略新添加的字段。对于旧代码,被删除的字段将具有其默认值,而被删除的重复字段将为空。

新代码也可以阅读旧消息。旧消息中不会出现新的字段;在这些情况下,protobuf会提供合理的默认值。

设置可选条件和字段类型后,您会分配字段编号。字段编号不能重新估算或重复使用。如果删除字段,则应保留其字段编号,以防止某人意外地重用该数字

实际测试proto2和proto3也可以兼容,例如一个主机使用proto2发送另一台主机使用proto3接收,相同的proto文件,分别使用proto2和proto3编译为cc和h,通信成功。

1.5 编译安装

源码下载地址: https://github.com/google/protobuf
安装依赖的库: autoconf automake libtool curl make g++ unzip

1
2
3
4
5
$ ./autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install

1.6 额外的数据类型支持

  • Duration is a signed, fixed-length span of time, such as 42s.
  • Timestamp is a point in time independent of any time zone or calendar, such as 2017-01-15T01:30:15.01Z.
  • Interval is a time interval independent of time zone or calendar, such as 2017-01-15T01:30:15.01Z - 2017-01-16T02:30:15.01Z.
  • Date is a whole calendar date, such as 2025-09-19.
  • DayOfWeek is a day of the week, such as Monday.
  • TimeOfDay is a time of day, such as 10:42:23.
  • LatLng is a latitude/longitude pair, such as 37.386051 latitude and -122.083855 longitude.
  • Money is an amount of money with its currency type, such as 42 USD.
  • PostalAddress is a postal address, such as 1600 Amphitheatre Parkway Mountain View, CA 94043 USA.
  • Color is a color in the RGBA color space.
  • Month is a month of the year, such as April.