??在接入第三方資料流或接入物聯網設備時,通常這些資料所上報的資料只是按照指定的協議所編碼,上報的資料流也不夠緊湊,如我們直接存盤這類位元組流資料也比較大,此時可以將位元組流轉為其他壓縮格式的流,如Protobuf等;
??將位元組流轉為Protobuf流具體流程為:定義Proto檔案、生成對應的Proto物件、讀取流資料寫入Proto物件、序列化Proto物件,
定義Proto檔案:
syntax = "proto3";
//包名,通過protoc生成時go檔案
package data;
//位置
message position {
int32 type = 1;
int32 lon = 2;
int32 lat= 3;
string status = 4;
}
程式
??將位元組資料轉為Protobuf所生成的物件;
資料流協議為7E頭7E尾,簡單起見這里就不使用轉碼了,位元組格式如下,
?? 7E-型別-經度-緯度-狀態長度-狀態
str := "7E0106C1FC5A0160C9640231327E"
buf := bytes.NewBuffer(toBytes(str))
p :=&test.Position{}
//跳過頭
buf.Next(1)
//讀取型別
var b byte
b,_=buf.ReadByte()
p.Type = int32(b)
//獲取經度
lon:=[]byte{0,0,0,0}
buf.Read(lon)
p.Lon=bytesToInt(lon)
//獲取緯度
lat:=[]byte{0,0,0,0}
buf.Read(lat)
p.Lat=bytesToInt(lat)
//獲取狀態
len,_:=buf.ReadByte()
//獲取len個長度的位元組陣列
data:= buf.Next(int(len))
p.Status=string(data)
fmt.Println("物件輸出:",p.String())
fmt.Println("Protobuf序列化: ",hex.EncodeToString(pData))
fmt.Println("原始資料:",str)
輸出結果:
??物件輸出: type:1 lon:113376346 lat:23120228 status:"12"
??Protobuf序列化: 080110daf8873618e492830b22023132
??原始資料: 7E0106C1FC5A0160C9640231327E
??由于這個例子資料欄位比較少,并沒有看出Protobuf序列化的優勢,具體對比可看這篇文章:透過byte陣列簡單分析Java序列化、Kryo、ProtoBuf序列化
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243452.html
標籤:Go
