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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM