ProtoBuf 基本使用
一、是什么
Protocol Buffers,是Google公司开发的一种数据描述语言,是一种平台无关、语言无关、可扩展且类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
二、为什么
- 更简单
- 数据描述文件只需原来的1/10至1/3
- 解析速度是原来的20倍至100倍
- 减少了二义性
- 生成了更容易在编程中使用的数据访问类且支持多种编程语言
三、支持的语言
| Language | Source |
|---|---|
| C++ (include C++ runtime and protoc) | src |
| Java | java |
| Python | python |
| Objective-C | objectivec |
| C# | csharp |
| JavaScript | js |
| Ruby | ruby |
| Go | golang/protobuf |
| PHP | php |
| Dart | dart-lang/protobuf |
四、Android 中使用
4.1 添加依赖
protobuf 插件
plugins {
...
// protobuf 插件, AS 3.x 需要 0.8.2 及以上
id 'com.google.protobuf' version '0.8.17'
}
AS 3.x对应的protoBuf版本必须不低于0.8.2,否则报错 Resolving configuration 'debugCompile' directly is not allowed
模块添加依赖
android {
...
sourceSets {
main {
// 配置 proto 源文件目录, 可选的, 默认在 'src/main/proto'
proto {
srcDir 'src/main/proto'
}
}
}
}
dependencies {
...
// protobuf
implementation "com.google.protobuf:protobuf-javalite:3.18.0"
}
protobuf {
// Configures the Protobuf compilation and the protoc executable
protoc {
// Downloads from the repositories
artifact = "com.google.protobuf:protoc:3.14.0"
}
// Generates the java Protobuf-lite code for the Protobufs in this project
generateProtoTasks {
all().each { task ->
task.builtins {
// Configures the task output type
java {
// Java Lite has smaller code size and is recommended for Android
option 'lite'
}
}
}
}
}
4.2 创建源文件
在对应源文件目录下面,创建文件。
如图:

文件内容如下:
syntax = "proto3"; // protobuf2 和 protobuf3 有区别
option java_package = "com.xyz.test"; // 指定生成的类的包名
option java_multiple_files = true; // 是否为每个类单独生成一个文件
// 类
message Pet {
int32 id = 0x01;
repeated Dog dogs = 0x02;
map<string, Cat> cats = 0x03;
}
message Dog {
string name = 0x01;
int32 age = 0x02;
}
message Cat {
string name = 0x01;
int32 age = 0x02;
string food = 0x03;
}
支持
枚举 enum
List: repeated
Map: map
更多数据结构请查阅官方文档。
4.3 编译源文件
build 之后,生成的代码如下:

可以点开查看对应代码。
建议:大型项目中,为了加快编译速度,可以将 pb 文件单独作为一个模块。
4.4 序列化与反序列化
val dog1 = Dog.newBuilder().setName("小黑").setAge(5).build()
val dog2 = Dog.newBuilder().setName("旺财").setAge(3).build()
val cat1 = Cat.newBuilder().setName("小花").setAge(4).setFood("猫粮").build()
val cat2 = Cat.newBuilder().setName("猫精").setAge(1000).setFood("人").build()
val pet = Pet.newBuilder().setId(1)
.putCats("凡间", cat1)
.putCats("妖界", cat2)
.addDogs(dog1)
.addDogs(dog2)
.build()
val toByteArray = pet.toByteArray()
val result: Pet? = try {
Pet.parseFrom(petArray)
} catch (ex: InvalidProtocolBufferException) {
Log.d(TAG, "parseData exception: ${ex.message}")
null
}
更多使用方法,请查阅官网文档和相应的 API
ProtoBuf 基本使用的更多相关文章
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- Protobuf使用规范分享
一.Protobuf 的优点 Protobuf 有如 XML,不过它更小.更快.也更简单.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍.你可以定义自己的数据结构 ...
- java netty socket库和自定义C#socket库利用protobuf进行通信完整实例
之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...
- 在Wcf中应用ProtoBuf替代默认的序列化器
Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...
- protobuf的编译安装
github地址:https://github.com/google/protobuf支持多种语言,有多个语言的版本,本文采用的是在centos7下编译源码进行安装. github上有详细的安装说明: ...
- 编译protobuf的jar文件
1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...
- protobuf学习(2)-相关学习资料
protobuf官方git地址 protobuf官方英文文档 (你懂的需要FQ) protobuf中文翻译文档 protobuf概述 (官方翻译 推荐阅读) protobuf入门 ...
- google protobuf安装与使用
google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...
- c# (ENUM)枚举组合类型的谷歌序列化Protobuf
c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...
- dubbox 增加google-gprc/protobuf支持
好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...
随机推荐
- [转帖]【redis】redis各稳定版本特性(更新到6.0版本)
1.Redis2.6 Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下: 1)服务端支持Lua脚本. 2)去掉虚拟内存相关功能. 3)放 ...
- Oracle PDB的相关使用说明
Oracle PDB的相关使用说明 摘要 PDB pluggable database 是Oracle12c以上的版本(Oracle18c.oracle19c) 新增加的一个特性. 他可以实现灵活插拔 ...
- CTF&爬虫:掌握这些特征,一秒识别密文加密方式
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 前言 爬虫工程师在做加密参数逆向的时候,经常会遇到各种各样的加密算法.编码.混淆,每个算法都有其对应的特征,对于一些较小的网站, ...
- Rocketmq学习4——Broker消息持久化原理源码浅析
一丶前言 在<Rocketmq学习3--消息发送原理源码浅析>中,我们学习了消息发送的要点: 本地缓存+rpc 请求namesever + 定时刷新,topic路由信息 负载均衡的选择一个 ...
- TienChin 渠道管理-添加渠道页面开发
略过,前面已将渠道管理的 index.vue 文件内容全部粘贴给你们了.
- go中channel源码剖析
channel 前言 设计的原理 共享内存 csp channel channel的定义 源码剖析 环形队列 创建 写入数据 读取数据 channel的关闭 优雅的关闭 M个receivers,一个s ...
- 个人找工作面试准备------以及别人面试心得{待更新中ing}
参考链接先放: https://blog.csdn.net/u014400934/article/details/102577804?utm_medium=distribute.pc_relevant ...
- C# 中类与继承等概念
C#是一种现代的.面向对象的编程语言,其中类和继承是面向对象编程语言中非常重要的概念,类和继承是C#中面向对象编程的基本概念,可以用于创建复杂的应用程序和模块,而多态和接口可以使程序更加灵活和可扩展. ...
- P9993 [Ynoi Easy Round 2024] TEST_133 题解
题目链接: [Ynoi Easy Round 2024] TEST_133 首先历史最大加,吉司机跑不掉了,维护历史最大加标记以及历史最大,那么根据吉司机标记思想更新操作应该为 \[new \Left ...
- Oracle 19c RAC自动应用RU补丁过程
笔者好久没有使用opatchauto打过补丁了,搜了下自己的历史随笔,上次opatchauto打补丁的记录还是Oracle 11g版本: Oracle 11g RAC 自动应用PSU补丁简明版 而11 ...