由于最近的项目开发要用到ProtoBuf,所以在这开一贴说说自己写的小demo。这款Google开发的开源项目相对于xml来说,它的优点主要有以下几点:
(1)性能好/效率高;
(2) 具有代码生成机制。
(3)支持向前/向后兼容。
(4)能够支持多种语言。
当然,“金无赤金,人无完人”,protobuf也是有缺点的。比如它采用二进制编码导致可读性变差。
在进行创建Demo之前,首先要下载关于Protobuf的文件,这里我用的是protobuf-2.4.1.tar.gz和与之相匹配的protobuf-java-2.4.1.jar文件。我已经将上述文件整理好放在了网盘中,大家如果有需要可以去下载。
链接:https://pan.baidu.com/s/1dS4q1eXVDFLxhkayYIQSXg
提取码:d30o
下载下来文件之后,解压之后如图所示:
等下会用到的是protoc.exe 和protobuf-java-2.4.1.jar文件。OK,前期的准备工作到这里就告一段落了,下面我们正式开始写Demo。
一、首先,我们创建一个.proto的文件,在记事本中写下以下内容,然后命名为PersonMsg.proto文件。
package protobuf;
option java_package = "com.sq.protobuf";//编译后生成Java文件的位置。
option java_outer_classname = "FirstProtobuf"; //编译之后生成的Java文件名称
message Person{
//ID
required int32 id =1;
// 姓名
required string name = 2;
//email
optional string email = 3;
//朋友
required string friends = 4;
//上面的1、2、3、4是unique numbered tag,是一个唯一标识
//required必填属性,optional选填属性
}
二、将上面写好的.proto文件放到与protoc.exe文件同级的目录下,之后再cmd命令行中执行下面的语句
protoc.exe --java_out = ./PersonMsg.proto
如果上面的语句编译报错,可以通过下面的语句进行编译,亲测有效。
protoc ./PersonMsg.proto --java_out=./
三、在IDEA或Eclipse中建立一个project,创建com.com.sq.protobuf包,然后将生成的FirstProtobuf.java文件加入到project中,这时候项目会报错,所以之前下载的protobuf-java-2.4.1.jar就要发挥作用了,将该jar文件导入到项目中,报错消失。
四、其实三四两步可以写一起的,但是我就想分开写,哈哈。好了,说正题了,新建一个测试类,代码如下:
package com.sq.protobuf;
import com.google.protobuf.InvalidProtocolBufferException;
public class Test_protobuf {
public static void main(String[] args){
//序列化
FirstProtobuf.Person.Builder builder = FirstProtobuf.Person.newBuilder();
builder.setId(1);
builder.setName("Jackson");
builder.setEmail("[email protected]");
builder.setFriends("Oliver");
FirstProtobuf.Person info = builder.build();
byte[] result = info.toByteArray();
System.out.println("序列化:"+result);
//反序列化
try {
FirstProtobuf.Person person = FirstProtobuf.Person.parseFrom(result);
System.out.println("反序列化:"+person);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
最后,运行程序,出现如下结果,这是可以看到序列化和反序列化的结果。
五、总结一下,Protobuf作为一个比XML更小,更快的一个方法,可以利用自己的代码生成机制生成代码去读写自己定义的数据结构,为我们省去了一大部分写协议解析代码的时间。当然,本文只是对Protobuf有了一个初始的认识,还希望读到这篇文章的读者们有什么意见或建议可以提出来,让大家一起进步!