Protobuf 序列化协议详解
来源:互联网 发布:js实现点击图片放大 编辑:程序博客网 时间:2024/06/05 05:37
Protocol Buffers是Google开发一种数据描述语言,能够将结构化数据序列化,可用于数据存储、通信协议等方面。据Google官方文档介绍,现在Google内部已经有48,162个消息类型定义在12,183个proto文件中。本文会从快速入门、语言规范、编码协议、性能评估等几个方面对Prototol Buffers进行介绍。
不了解Protocol Buffers的同学可以把它理解为更快、更简单、更小的JSON或者XML,区别在于Protocol Buffers是二进制格式,而JSON和XML是文本格式。
相对于XML,Protocol Buffers的具有如下几个优点:
- 简洁
- 体积小:消息大小只需要XML的1/10 ~ 1/3
- 速度快:解析速度比XML快20 ~ 100倍
- 使用Protocol Buffers的编译器,可以生成更容易在编程中使用的数据访问代码
- 更好的兼容性,Protocol Buffers设计的一个原则就是要能够很好的支持向下或向上兼容。
看一个简单的对比例子,表达一个用户的三个基本的属性,如果使用XML消息体大小为82 bytes。
如果使用JSON消息体大小为56 bytes。
使用Protocol Buffers咋则只需要 31 bytes,看到这些二进制数据大家可以暂时忽略,后面会具体分析这些二进制数据是如何编码的。
接下来先看一个简单的入门示例,在该例子中我们从准备环境开始,编写proto文件,到最后使用Protocol Buffers编译器生成代码,再到具体的使用。
从https://github.com/google/protobuf下载编译安装protoc,并下载Protobuf SDK。
开始编写proto文件,使用message关键字定义消息类型,消息中每个字段需要指定字段类型和字段序号。同一个message中字段
使用protoc命令生成代码,使用--cpp_out、--java_out、--python_out命令选项可以生成C++、Java、Python代码,在最新版本Protocol Buffers v3中还加入了ruby语言的支持。
生成代码的代码可以直接加入到自己的代码工程中使用,以C++语言为例:
这是一段Java语言的使用示例:
接下来会详细说明如何定义proto文件:
在消息定义中,我们需要确定三个问题:
- 确定消息命名,给消息取一个有意义的名字。
- 指定字段的类型
定义字段的编号,在Protocol Buffers中,字段的编号非常重要,字段名仅仅是作为参考和生成代码用。需要注意的是字段的编号区间范围,其中19000 ~ 19999被Protocol Buffers作为保留字段。
字段约束,required指定该字段必须赋值,禁止为空(在v3中该约束被移除);optional指定字段为可选字段,可以为空,对于optional字段还可以使用[default]指定默认值,如果没有指定,则会使用字段类型的默认值;使用repeated指定字段为集合。
在一个proto文件中可以同时定义多个message类型,生成代码时根据生成代码的目标语言不同,处理的方式不太一样,如Java会针对每个message类型生成一个.java文件。还可以使用C++风格的注释。
在Protocol Buffers中提供了很多的标量类型,供我们在定义字段类型时使用。
可以指定字段的类型为其他message类型,如图中的示例代码所示:
还可以使用import关键字导入其他proto文件,这有利于你进行自己的proto文件的规划和整理。
在proto文件中消息的类型还可以嵌套,如你定义的message类型仅作为另外一个Message的字段类型。
为了便于扩展,在proto文件中可以使用extensions关键字预留一部分字段编号出来,以便于后期给第三方扩展时使用。
oneof关键字指定一组字段中,至少要有一个字段必须赋值。如在用户登录系统中,使用邮箱和用户名都可以登录该系统,所以通常会要求至少提供用户名或者邮箱。
0 0
- Protobuf 序列化协议详解
- Protobuf序列化协议
- protobuf (序列化协议)
- Protobuf协议格式详解
- Protobuf协议格式详解
- 序列化协议(protobuf,xstream,jackjson,jdk,hessian)对比
- 解密:protobuf协议序列化后的变体
- 使用protobuf-net 进行协议的序列化
- protobuf序列化存储
- 序列化protobuf
- protobuf序列化原理
- Protostuff工具实现ProtoBuf序列化使用详解
- Jackson--protobuf序列化积累
- C# Protobuf-Net 序列化
- google protobuf序列化原理
- Python 序列化之 ProtoBuf
- google protobuf序列化原理
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- 版本控制:svn、git
- MySQL 5.7.9版本sql_mode=only_full_group_by问题
- MyEclipse中设置javascript提示代码
- 详解Session分布式共享(.NET CORE版)
- QT操作EXCEL
- Protobuf 序列化协议详解
- 后台传送时间格式数据json转换
- 白岩松:没有一代人的青春是容易的
- IDEA最有用的快捷键
- 第2天:再接着介绍一下Python呗
- HDU 3347 Calculate the expression By Assassin 模拟水题
- 第3天:Numpy你好
- SpringMVC学习笔记2
- [iOS开发]Xcode8.3兼容iOS10.3.1以及低版本Xcode调试高版本iOS系统