protobuf nano是一个比较新的Protobuf官方实现,很适合在android应用中使用,相比原来的java实现,减少代码量和方法数,原为了这个问题而用C++实现的朋友们,可以换到这个实现,避免尴尬。
定义.proto
文件
1 | package tutorial; |
常用的类型:
bool, int32, float, double, and string
。
“= 1”, “= 2” 叫Tag,代表是编码时的编号,这个编号很重要,解码时也是根据这个编码来的。
尽量使用1-15范围内的Tag定义,16开始会占用更多的数据空间。建议使用嵌套或者repeated
的方式来避免超过15。
required
必填字段,如果创建数据对象时不传入参数,编码时就会抛出Exception
。optional
可选字段,可以不传入数据,或者设置默认值。
使用
required
要注意,如果你升级协议时把这个字段改为optional
,接收方没有升级,你发送的数据对方将无法解释。因此 不建议 使用它,我们只使用optional
和repeated
。
官方的.proto
文档,可以参考Protocol Buffer Language Guide。
选择一个编译器
当你有了.proto
文件后,你需要把它用编译器生成为一份代码。编译器有不同的平台/实现,我们这里选择protoc
,它将会生成“bean”、“编解码”。
下载编译器
从 https://github.com/google/protobuf/releases 这里可以下载source到本地编译,也可以下载可执行文件。我选择了可执行文件 https://github.com/google/protobuf/releases/download/v3.2.0/protoc-3.2.0-osx-x86_64.zip 。下载后解压,运行$ bin/protoc --version
,能正常显示版本。
执行编译器
执行
1 | $ ./protoc -I $SRC_DIR --java_out=$JAVA_DIR $SRC_DIR/addressbook.proto |
例如:
1 | ./protoc -I ../../proto --java_out=../../java ../../proto/addressbook.proto |
建议生成javanano版本,这个版本特别适合android,生成的文件小非常多,当然性能是比java差一点点。
1 | $ ./protoc -I $SRC_DIR --javanano_out=$JAVA_DIR $SRC_DIR/addressbook.proto |
使用Java Protobuf API来读写消息
刚才生成的代码是编译不通过的,需要导入protobuf
的jar包。
在build.gradle
中加入:
1 | compile 'com.google.protobuf.nano:protobuf-javanano:3.1.0' |
如果使用非nano版本可以用:
1 | compile 'com.google.protobuf:protobuf-java:3.2.0' |
这里推荐使用nano版本。
读取数据
1 | public static List<AddressBookProtosNano.Person> list(Context context) throws Exception { |
写入数据
1 | public static void create(Context context, String name, String email, String number, String type) throws Exception { |
源码
参照官方的文档写了个sample的项目,详细可以去这里下载:https://github.com/itvincent-git/protobuf-sample