首页 > 其他分享 >ProtoBuf 基本使用

ProtoBuf 基本使用

时间:2023-04-08 16:22:58浏览次数:37  
标签:基本 java protobuf val Dog newBuilder build 使用 ProtoBuf

一、是什么

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

标签:基本,java,protobuf,val,Dog,newBuilder,build,使用,ProtoBuf
From: https://www.cnblogs.com/joy99/p/17298718.html

相关文章

  • wireShark的简单使用
    wireShark的简单使用在对接某个项目的SDK时,发下隔一段,请求第三方服务时,老是出现"ReadTimedout"异常,看代码没有发现问题,于是想通过抓包来看看日志1、使用tcpdump来抓包tcpdumptcpportxxx-s0-wcapture.pcap&指定端口号xxx,-s0输出详细信息,-wcapture.pcap将......
  • Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码
    原文:http://inventwithpython.com/beyond/chapter3.html代码格式化是将一组规则应用于源代码,从而使得代码风格能够简洁统一。虽然代码格式对解析程序的计算机来说不重要,但代码格式对于可读性是至关重要的,这是维护代码所必需的条件。如果你的代码对人(无论是你还是同事)来说都很......
  • Arrays.stream().boxed()的使用
    Arrays.stream().boxed()的使用0.写在前面1.Arrays.stream()的使用算法:代码:输出结果:2.boxed()的使用boxed()方法实现在原始类型「primitives」和盒式类型「boxed」之间转换数组3.参考0.写在前面文章翻译自以下本文的最后链接1.Arrays.stream()的使用算法:获取要转换的数组。使......
  • 大型互联网系统技术架构设计的4个基本要素
    作为一名大厂SRE,对什么是好产品(技术架构角度)有深刻的感悟。一个好产品的技术架构不仅在优秀的代码本身,更体现在后期的易运维性、可扩展性、高可用性上。随着用户体量、产品功能、IaaS、PaaS的变化甚至员工的离职,随时需要动态调整架构改变策略来应对各种问题,而这些场景都是对技术架......
  • 本地变量的使用范围
    一、可以使用二、可以使用三、并列for、while、if中内部变量不通用四、switch也不可以使用五、总结、只能在自己代码块里使用(大括号为一个代码块)红框框里为一个代码块......
  • windows 下使用CMake 配置 googletest测试库
    这个项目实际包含的知识细节,可以在微软的网站找到支持:1.安装googletest.下载,解压,googletest 进入开发者模式cmd界面: DeveloperCommandPromptforVS2022 编译,安装googletest#在解压后的目录下mkdirbuildcdbuild#准备安装在d:/googletestcmake-S..-B......
  • 谷歌浏览器 使用中文翻译
    一、找到host文件,并打开。例如以下:二、将 172.217.192.90translate.googleapis.com直接粘贴到host文件的底部即可。(PS:该信息是IP+谷歌域名组成。IP有有效期(即会失效))解决方法:关注月光博客公众号  发送谷歌翻译会给出新的ip  ......
  • 在 PostgreSQL 中使用 EXCLUDE 值进行 Upsert(重复更新时插入、合并)
    上次,我们读到了如何在PostgreSQL中使用 UPSERT。在快速回顾中,UPSERT 是 INSERTONDUPLICATEUPDATE 的缩写,如果它们与以前的条目不匹配,则倾向于将 INSERT 值插入表中。如果有,它们会自动更新。PostgreSQL中的 EXCLUDED 是什么EXCLUDED 是DBMS给一个特殊表的名称,......
  • .NET 6版本中间件的使用
    .NET6版本中间件的使用中间件是一种处理HTTP请求和响应的可重用组件,通常用于添加处理逻辑或修改请求和响应。本文将演示如何创建.NET6版本的中间件。创建中间件让我们从创建一个简单的中间件类开始。我们将打印请求的URL,然后调用下一个中间件:publicclassMyMiddleware{......
  • DecimalFormat的使用
    参考博客:https://blog.csdn.net/weixin_42721317/article/details/115675707https://www.jianshu.com/p/b3699d73142e一、保留两位小数publicclassTestDecimal{publicstaticvoidmain(String[]args){//保留两位小数(截断)doublenum=11.256;......