1. 程式人生 > 其它 >Protobuf安裝與三種序列化反序列化方式

Protobuf安裝與三種序列化反序列化方式

技術標籤:nettyprotobuf

首先,我們進入官網下載

https://github.com/protocolbuffers/protobuf/releases/

下載最新版protoc-3.14.0-win64.zip
在這裡插入圖片描述
我是windows版本,linux版本的可以下載相應的包

解壓後將bin目錄的路徑新增至Path

這樣就安裝好protoc編譯器了

我們在IDEA中編寫好**.proto**型別的檔案

// [開始宣告]
syntax = "proto3";
 //定義protobuf的包名稱空間
package protocol;
// [結束宣告]

// [開始 java 選項配置]
option java_package = "protocol";
option java_outer_classname = "MsgProtos";
// [結束 java 選項配置]

// [開始 訊息定義]
message Msg {
  uint32 id = 1;  // Unique ID number for this person.
  string content = 2;
}

// [結束 訊息定義]

執行cmd,將相應的檔案進行編譯。
在這裡插入圖片描述
生成相應的protobuf檔案。

生成後我們有三種用protobuf進行序列化和反序列化的方式:

首先我們創造好資料:

    public static MsgProtos.Msg buildMsg() {
        MsgProtos.Msg.Builder personBuilder = MsgProtos.Msg.newBuilder();
        personBuilder.setId(1);
        personBuilder.setContent("哈哈哈哈哈");
        MsgProtos.
Msg message = personBuilder.build(); return message; }

第一種

    @Test
    public void serAndDesr1() throws IOException {
        MsgProtos.Msg msg = buildMsg();//將pojo轉化為二進位制流
        byte[] data = msg.toByteArray();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(data); data = outputStream.toByteArray(); MsgProtos.Msg result = MsgProtos.Msg.parseFrom(data);//將二進位制流轉化為pojo System.out.println(result.getId()); System.out.println(result.getContent()); }

第二種:

    @Test
    public void serAndDesr2() throws IOException{
        MsgProtos.Msg msg = buildMsg();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        msg.writeTo(outputStream);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        MsgProtos.Msg result = MsgProtos.Msg.parseFrom(inputStream);
        System.out.println(result.getId());
        System.out.println(result.getContent());
    }

第三種通過writeDelimitedToparseDelimitedFrom進行序列化反序列化

    @Test
    public void serAndDesr3() throws IOException{
        MsgProtos.Msg message = buildMsg();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        message.writeDelimitedTo(outputStream);
        message.writeDelimitedTo(outputStream);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        //從二進流,反序列化成Protobuf 物件
        MsgProtos.Msg inMsg = MsgProtos.Msg.parseDelimitedFrom(inputStream);
        System.out.println(inMsg.getId());
        System.out.println(inMsg.getContent());
    }