本文由sweetying分享,为了更好的阅读体验,即时通讯网有较多的内容修订和排版优化。
cover-opti.png (17.67 KB, 下载次数: 1219)
下载附件 保存到相册
1 年前 上传
0.png (10.24 KB, 下载次数: 1199)
1.png (17.17 KB, 下载次数: 1218)
2.png (28.28 KB, 下载次数: 1172)
3.png (11.95 KB, 下载次数: 1205)
# protobuf 环境变量 export PROTOBUF_HOME=/Users/zhouying/Downloads/protoc-3.19.2-osx-x86_64 export PATH=${PATH}:${PROTOBUF_HOME}/bin
4.png (5.66 KB, 下载次数: 1319)
//一键安装 protobuf brew install protobuf //一键卸载 protobuf brew uninstall protobuf
5.png (26.44 KB, 下载次数: 1242)
6.png (25.17 KB, 下载次数: 1187)
7.png (33.04 KB, 下载次数: 1232)
8.png (68.56 KB, 下载次数: 1239)
9.png (87.97 KB, 下载次数: 1247)
//例如说我在 Java 里面进行如下定义: int a = 1; //因为 int 类型占 4 个字节,1个字节占 8 位,我们把 1 的字节占位给列出来: 00000000 00000000 00000000 00000001 //可以看到 1 的前面 3 个字节占位都是 0,在 Protobuf 里面是可以去掉的,于是就变成了: 00000001 //因此 1 在 Protobuf 里面就只占用了一个字节,节省了空间
10.png (15.44 KB, 下载次数: 1202)
//指定 Protobuf 版本 syntax = "proto3"; //指定包名 package erdai; //定义一个学生的消息类 message Student{ //姓名 string name = 1; //年龄 int32 age = 2; //邮箱 string email = 3; //课程 repeated string course = 4; //相当于 Java 的 List<String> }
message Weather{ int32 query = 1; //季节 enum Season{ //允许对枚举常量设置别名 option allow_alias = true; //枚举里面的 = 操作是对常量进行赋值操作 //春 SPRING = 0; //夏 SUMMER = 1; //秋 如果不设置别名,不允许存在两个相同的值 FALL = 2; AUTUMN = 2; //冬 WINTER = 3; } //对 season 进行编号 Season season = 2; }
repeated string list = 1; //类似 Java 的 List<String> map<string,string> = 2; //类似 Java 的 Map<String,String>
11.png (22.98 KB, 下载次数: 1184)
implementation 'com.google.protobuf:protobuf-java:3.19.2'
buildscript { repositories { gradlePluginPortal() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.19' } }
//1、如果使用的是 apply 方式,Android 插件必须在 Protobuf 插件之前,如下: apply plugin: 'com.android.application' apply plugin: 'com.google.protobuf' //2、如果使用的是 Gradle DSL 方式,则与顺序无关 plugins { id 'com.google.protobuf' id 'com.android.application' }
android { //... } protobuf { //配置 protoc 编译器 protoc { artifact = 'com.google.protobuf:protoc:3.19.2' } //配置生成目录,编译后会在 build 的目录下生成对应的java文件 generateProtoTasks { all().each { task -> task.builtins { remove java } task.builtins { java {} } } } }
android { //... sourceSets { main { //实际测试指不指定无所谓,不影响 Java 文件生成 proto { srcDir 'src/main/proto' } } } }
//指定 Protobuf 版本 syntax = "proto3"; //指定包名 package erdai; //定义一个学生的消息类 message Student{ //姓名 string name = 1; //年龄 int32 age = 2; //邮箱 string email = 3; //课程 repeated string course = 4; } //定义一个天气的消息类 message Weather{ int32 query = 1; //季节 enum Season{ option allow_alias = true; //春 SPRING = 0; //夏 SUMMER = 1; //秋 FALL = 2; AUTUMN = 2; //冬 WINTER = 3; } Season season = 2; }
12-opti.png (45.61 KB, 下载次数: 1204)
protoc --java_out=${"你要生成的 Java 文件目录"} ${"Protobuf 文件位置"} //以我的为例: protoc --java_out=./app/src/main/java ./app/src/main/proto/student.proto
13.png (40.04 KB, 下载次数: 1192)
14.png (31 KB, 下载次数: 1196)
Student (实现了 StudentOrBuilder 接口) Weather (实现了 WeatherOrBuilder 接口) StudentOrBuilder (接口) WeatherOrBuilder (接口)
fun main(){ //构建 Protobuf 对象 val student = StudentOuterClass.Student.newBuilder() .setName("erdai") .setAge(18) .setEmail("erdai666@qq.com") .addAllCourse(mutableListOf("Math", "English", "Computer")) .build() println(student) println() println(StudentOuterClass.Weather.Season.SPRING.number) println(StudentOuterClass.Weather.Season.SUMMER.number) println(StudentOuterClass.Weather.Season.AUTUMN.number) println(StudentOuterClass.Weather.Season.WINTER.number) } //打印结果 name: "erdai" age: 18 email: "erdai666@qq.com" course: "Math" course: "English" course: "Computer" 0 1 2 3
fun main(){ //1、构建 Protobuf 对象 val student = StudentOuterClass.Student.newBuilder() .setName("erdai") .setAge(18) .setEmail("erdai666@qq.com") .addAllCourse(mutableListOf("Math", "English", "Computer")) .build() //2、序列化并返回一个包含其原始字节的字节数组 val byteArray: ByteArray = student.toByteArray() //3、反序列化从字节数组中解析消息 val parseStudent: StudentOuterClass.Student = StudentOuterClass.Student.parseFrom(byteArray) }
implementation 'com.google.protobuf:protobuf-java-util:3.19.2'
fun main(){ //1、构建 Protobuf 对象 val student = StudentOuterClass.Student.newBuilder() .setName("erdai") .setAge(18) .setEmail("erdai666@qq.com") .addAllCourse(mutableListOf("Math", "English", "Computer")) .build() //2、Protobuf 转 Json val json = JsonFormat.printer().print(student) //3、打印 json println(json) } //打印结果 { "name": "erdai", "age": 18, "email": "erdai666@qq.com", "course": ["Math", "English", "Computer"] }
fun main(){ //1、构建 Protobuf 对象 val student = StudentOuterClass.Student.newBuilder() .setName("erdai") .setAge(18) .setEmail("erdai666@qq.com") .addAllCourse(mutableListOf("Math", "English", "Computer")) .build() //2、Protobuf 对象转 Json val json = JsonFormat.printer().print(student) //3、Json 转 Protobuf 对象 val builder = StudentOuterClass.Student.newBuilder() JsonFormat.parser().ignoringUnknownFields().merge(json,builder) //4、打印 Protobuf 对象 println(builder.build()) } //打印结果 name: "erdai" age: 18 email: "erdai666@qq.com" course: "Math" course: "English" course: "Computer"
implementation 'com.google.code.gson:gson:2.8.9'
data class MyStudent( var name: String? = "", var age: Int = 0, var email: String? = "", var course: MutableList<String>? = null )
fun main(){ //1、构建 Protobuf 对象 val student = StudentOuterClass.Student.newBuilder() .setName("erdai") .setAge(18) .setEmail("erdai666@qq.com") .addAllCourse(mutableListOf("Math", "English", "Computer")) .build() //2、将 Protobuf 转换为 Json val json = JsonFormat.printer().print(student) //3、将 Json 转换为 Java Bean 对象 val myStudent = Gson().fromJson(json,MyStudent::class.java) println(myStudent) } //打印结果 MyStudent(name=erdai, age=18, email=erdai666@qq.com, course=[Math, English, Computer])
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.136724 second(s), 42 queries , Gzip On.