Google protobuf序列化以及反序列化
Posted gdpuzxs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google protobuf序列化以及反序列化相关的知识,希望对你有一定的参考价值。
序列化的目的是将对象持久化到硬盘或者用于网络传输。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,序列化同一个对象,看看序列化后的对象大小。
(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个字节。
参考地址:http://www.tuicool.com/articles/EJrQRr3
以上是关于Google protobuf序列化以及反序列化的主要内容,如果未能解决你的问题,请参考以下文章
Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)
使用 C# Google.Protobuf 将 ByteString 反序列化为对象