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序列化以及反序列化的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf 反序列化异常

基于protobuf2.6序列化 反序列化

Google 的Protobuf 的使用方式(序列化和反序列化工具-编解码)

使用 C# Google.Protobuf 将 ByteString 反序列化为对象

GOOGLE-PROTOBUF与FLATBUFFERS数据的序列化和反序列化

Google Protobuf反序列化重复对象get操作的时间复杂度