一、是什么

Protocol Buffers,是Google公司开发的一种数据描述语言,是一种平台无关、语言无关、可扩展且类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。

二、为什么

  1. 更简单
  2. 数据描述文件只需原来的1/10至1/3
  3. 解析速度是原来的20倍至100倍
  4. 减少了二义性
  5. 生成了更容易在编程中使用的数据访问类且支持多种编程语言

三、支持的语言

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 基本使用的更多相关文章

  1. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  2. Protobuf使用规范分享

    一.Protobuf 的优点 Protobuf 有如 XML,不过它更小.更快.也更简单.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍.你可以定义自己的数据结构 ...

  3. java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

    之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...

  4. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  5. protobuf的编译安装

    github地址:https://github.com/google/protobuf支持多种语言,有多个语言的版本,本文采用的是在centos7下编译源码进行安装. github上有详细的安装说明: ...

  6. 编译protobuf的jar文件

    1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...

  7. protobuf学习(2)-相关学习资料

    protobuf官方git地址 protobuf官方英文文档   (你懂的需要FQ) protobuf中文翻译文档 protobuf概述          (官方翻译 推荐阅读) protobuf入门 ...

  8. google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  9. c# (ENUM)枚举组合类型的谷歌序列化Protobuf

    c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...

  10. dubbox 增加google-gprc/protobuf支持

    好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...

随机推荐

  1. [转帖]Innodb存储引擎-备份和恢复(分类、冷备、热备、逻辑备份、二进制日志备份和恢复、快照备份、复制)

    文章目录 备份和恢复 分类 冷备 热备 逻辑备份 mysqldump SELECT...INTO OUTFILE 恢复 二进制日志备份与恢复 快照备份(完全备份) 复制 快照+复制的备份架构 备份和恢 ...

  2. Ergonomics JVM 的一种FullGC的说明

    https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html 2 Ergonomics Ergo ...

  3. [转帖]iptables命令详解和举例(完整版)

    1.防火墙概述 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底 ...

  4. [转帖]兆芯官方的CPU测试成绩,我复现不了

      https://baijiahao.baidu.com/s?id=1734998483605483848 下图是兆芯网官上的公开测试成绩,测试对象是3.0GHz的KX-U6880A. 有几个问题: ...

  5. [转贴]一图弄懂ASCII、GB2312、GBK、GB18030编码

    一图弄懂ASCII.GB2312.GBK.GB18030编码 https://blog.csdn.net/LightUpHeaven/article/details/92008630 转载君子不器.  ...

  6. css中也可以使用变量了?

    前言 大家都听说过变量,我们学习的任何语言都有变量的存在. css中是否也存在变量呢? 也许很多小伙伴也是通过less,scss中来使用css变量 其实在css中也是有变量的,今天我们也来学习一下. ...

  7. 大数据面试题集锦-Hadoop面试题(一)

    目录 1.集群的最主要瓶颈 2.Hadoop运行模式 3.Hadoop生态圈的组件并做简要描述 4.解释"hadoop"和"hadoop 生态系统"两个概念 5 ...

  8. 在C#或python中使用xpath解析xml

    记几个笔记 文件后缀不一定要.xml,可以是任意后缀,只要内容是符合xml和格式即可解析出来 文件编码需要是utf-8,python和c#都需要,或者xml文件头有这样一句:<?xml vers ...

  9. 从零开始配置 vim(8)——文件类型检测

    在上一章介绍自动命令的时候,我们提到可以使用 FileType来根据文件类型来触发事件,但是关于文件类型并没有深入的介绍,本篇我们来补充关于文件类型相关的内容,让大家更好的理解,看不懂也没关系,你只需 ...

  10. TienChin 活动管理-活动状态完善

    修改字典 修改活动状态字典,将之前的数据键值为 0 的数据标签内容改为 过期: 更改下数据库的描述,禁用改为过期: ALTER TABLE `tienchin_activity` MODIFY COL ...