精简版Android ProtoBuf入门
前言
在ProtoBuf前加Android实际是不太合适的,但本篇处理介绍ProtoBuf的基本概念优缺点外,使用主要针对广大的Android开发者。
定义
Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.
定义还是官方比较精准:
Protocol Buffers 是google的结构化序列化数据的与语言、平台无关的可扩展机制。
个人总结看来就是一种高效数据传输协议
优缺点
-
优点
-
语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
-
高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
-
扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序
作者:404_89_117_101
链接:https://www.jianshu.com/p/a24c88c0526a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
-
缺点
可读性差,牺牲了可读性来换取高效率。所以用ProtoBuf的场景是对传输效率要求高的场合,相比于传统的json和xml应用场景没有那么丰富。
使用
-
定义.proto文件
-
下载编译器,编译.proto文件,生成java类代码(相当于bean文件)
message xxx { // 字段规则:required -> 字段只能也必须出现 1 次 // 字段规则:optional -> 字段可出现 0 次或1次 // 字段规则:repeated -> 字段可出现任意多次(包括 0) // 类型:int32、int64、sint32、sint64、string、32-bit .... // 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字) 字段规则 类型 名称 = 字段编号; }
定义规则如上
实例:
MyProtobuf.proto
syntax = "proto2"; option java_package = "com.wason.protobuf";//包名 option java_outer_classname = "ProtobufSample";//类名 message User { required int32 id = 1; optional string name = 2; }
// $SRC_DIR: .proto 所在的源目录 // --java_out: 生成 java 代码 // $DST_DIR: 生成代码的目标目录 // xxx.proto: 要针对哪个 proto 文件生成接口代码 protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/xxx.proto
我的对应的编译命令:
protoc -I=./ --java_out=./java ./MyProtobuf.proto
-
AndroidStudio中使用生成的java代码
需要导入protobuf包
dependencies { implementation 'com.google.protobuf:protobuf-java:3.8.0' implementation 'com.google.protobuf:protobuf-java-util:3.8.0'
把编译生成的ProtobufSample.java拷贝到项目中
具体引用:
ProtobufSample.User protoSample = ProtobufSample.User.newBuilder() .setId(2).setName("wason").build(); Log.d("protobuf--->>", "onCreate: " + protoSample); try { ProtoSample.Student protoSample1 = ProtoSample.Student.parseFrom(protoSample.toByteArray()); Log.d("protobuf--->>", "onCreate: " + protoSample1); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); }
输出:
遇到问题欢迎交流QQ:1251600274