Protobuf安裝與三種序列化反序列化方式
阿新 • • 發佈:2021-01-06
首先,我們進入官網下載
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());
}
第三種通過writeDelimitedTo和parseDelimitedFrom進行序列化和反序列化:
@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());
}