Google protobuf序列化以及反序列化

时间:2022-02-23 16:04:41

  序列化的目的是将对象持久化到硬盘或者用于网络传输。java也提供了序列化技术,非常简单,只要实现Serializable接口即可。如下:

public class commonService implements Serializable {

private static final long serialVersionUID = 1L;
}

  这种方式有以下几个缺点:(1)无法跨语言    (2)序列化的码流太大   (3)序列化的性能差

  下面我测试一下序列化一个对象后的大小,代码如下:

public class TestBuf implements Serializable {

private int id;
private String url;
private ArrayList<String> name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public ArrayList<String> getName() {
return name;
}

public void setName(ArrayList<String> name) {
this.name = name;
}
}
 public static void main(String[]args)throws IOException{

TestBuf testBuf1
= new TestBuf();
testBuf1.setId(
1);
testBuf1.setUrl(
"www.baidu.com");
ArrayList
<String> list = new ArrayList<String>();
list.add(
"aaa");
list.add(
"bbb");
list.add(
"ccc");
testBuf1.setName(list);
ByteArrayOutputStream outputStream
= new ByteArrayOutputStream();
ObjectOutputStream outputStream1
= new ObjectOutputStream(outputStream);
outputStream1.writeObject(testBuf1);
System.out.println(
"Serializable====="+outputStream.toByteArray().length);
}

  运行结果如下:Google protobuf序列化以及反序列化

  接下来我们使用google protobuf,序列化同一个对象,看看序列化后的对象大小。

    (1)首先下载 protoc.exe和protobuf-java-2.5.0.jar ,地址http://download.csdn.net/detail/yangheng362/8516923

  (2)编写proto文件,这里命名为test.proto,代码如下:

package protobuf; 
option java_package
= "com.test.protobuf";
option java_outer_classname
= "FirstProtobuf";
message testBuf {
required int32 ID
= 1;
optional string Url
= 2;
repeated string name
=3;
}

  option java_package = "com.test.protobuf"; 就是生成的路径。

  option java_outer_classname = "FirstProtobuf"; 就是生成的类名称。

  required\optional\repeated就是一些修饰符,分别是必填,可选以及集合。

  (3)将文件放在解压的protoc.exe同级目录下,启动cmd控制台,执行代码如下:

protoc ./test.proto --java_out=./

  (4)把生成的文件FirstProtobuf.java拷到新建的java目录下, 引入jar包 protobuf-java-2.5.0.jar 

  (5)测试序列化以及反序列化,代码如下:

public class TestProtobuf {

public static void main(String[]args)throws IOException{
FirstProtobuf.testBuf.Builder builder
= FirstProtobuf.testBuf.newBuilder();
builder.setID(
1);
builder.setUrl(
"www.baidu.com");
builder.addName(
"aaa");
builder.addName(
"bbb");
builder.addName(
"ccc");
FirstProtobuf.testBuf info
= builder.build();
byte[] result = info.toByteArray();
System.out.println(
"google protobuf====="+result.length);
FirstProtobuf.testBuf testBuf
= FirstProtobuf.testBuf.parseFrom(result);
System.out.println(testBuf);
}

}

  显示结果如下:同样的对象,使用java自带的序列化的大小为201字节,而google的protobuf只有32个字节。

  Google protobuf序列化以及反序列化

  参考地址:http://www.tuicool.com/articles/EJrQRr3