在接入第三方數據流或接入物聯網設備時,一般這些數據所上報的數據只是按照指定的協議所編碼,上報的數據流也不夠緊湊,如咱們直接存儲這類字節流數據也比較大。此時能夠將字節流轉爲其餘壓縮格式的流,如Protobuf等;
將字節流轉爲Protobuf流具體流程爲:定義Proto文件、生成對應的Proto對象、讀取流數據寫入Proto對象、序列化Proto對象。html
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
原始數據: 7E0106C1FC5A0160C9640231327Ecode
因爲這個例子數據字段比較少,並無看出Protobuf序列化的優點,具體對比可看這篇文章:透過byte數組簡單分析Java序列化、Kryo、ProtoBuf序列化htm