首先需要了解下什么是protobuf。它是谷歌开源的消息传输协议,比JSON、XML等更快、更轻、更小。并且支持跨平台跨平台。
我们完全可以考虑使用protobuf代替JSON或者XML。不过其配置比JSON或者XML繁琐一下。
我们先从github上下载protobuf
https://github.com/google/protobuf.git
下载的只是protobuf的源代码,我们需要用gcc进行编译。
我们进入protobuf文件夹下。
./configure
make
make check
make install
执行完上述命令后,就编译完整个protobuf了。而protobuf的命令行工具文件在/src文件夹下面。
我们将该文件夹加入到环境变量中以方便使用。
sudo vim /etc/paths
将文件在Finder打开,然后拖入到终端,保存后退出。
接着我们编写protobuf文件,命名为com.model.Person.proto
syntax = "proto2";
option java_package = "com.model";
option java_outer_classname = "Person";
message person
{
required int32 id = 1;
required string username = 2;
required string password = 3;
}
这里使用了proto2的语法。
java_package 定义了生成的Java文件会在哪个包下面
java_outer_classname 定义了这个Java文件最外面的类名字为Person
message person 定义了这个Java文件中会有一个外部类为Person的内部类person。然后定义了它的属性id、username、password
我们执行命令,就会生成com.model.Person.java文件了。
protoc --java_out=./java ./com.model.Person.proto
–java_out 定义了protobuf的输出为Java文件,并且输出的目录为当前的java文件夹下。之前定义了java_package = “com.model”。会自动的判断java文件夹下是否有com/model文件夹,如果没有,则会自动创建。
这样我们就生成了Person类了。
我们来开始使用这个类。
Person.person.Builder builder = Person.person.newBuilder();
builder.setId(1);
builder.setUsername("Aiden");
builder.setPassword("123456");
person one = builder.build();
byte[] bytes = one.toByteArray();
System.out.println(Arrays.toString(bytes));
Person.person two = Person.person.parseFrom(bytes);
System.out.println(two.toString());
可能会有人觉得很奇怪。为什么是Person.person?
这是因为刚刚protobuf文件写的使用定义了java_outer_classname = “Person”,这个Person只是作为外部类而已,这个外部类能够包含很多数据类型,其中就包含了person。而person这个内部类只能通过构造器模式生成,不能直接new,就有了上面的代码了。
我们输出了person的字节,可以看出,只用了17个字节就存储了person对象,这可比JSON(JSON需要41个字节)可小的多了!