1. 程式人生 > >【Golang】讀源碼知 【encode/binary】

【Golang】讀源碼知 【encode/binary】

傳遞 規則 AR 不能 反序列化 lan light str window

go version 
go1.9.2 windows/amd64

如果你覺得xml,json等不能滿足你程序的需要,那麽你可能用到傳統的二進制協議來作為服務之間數據協議

1. 頂層結構可以是基本類型或者是基本類型的切片

2. 可以指定大小端規則

4. 定長,當時結構體的時候,整個結構的大小,也就是最終變成bytes的長度時已經固定的,換而言之,不支持任何變長的類型,例如slice,string,map...,替代的可能是各種各樣的數組。

5. 疑惑,雖然結構體是定長的,但是從源代碼來看,依然每次序列化的時候,依然會去計算一次數據的長度,但是根據bench測試,其效果差距也不算大,但是對於c/c++端的序列化和反序列化就有十分大的優化了,因為結構體本身不需要序列化,只需要拷貝內存就可以了。

與ProtoBuffer序列化相比:

encode/binary序列化計算過程

1. 計算長度,遍歷每個字段來遞歸。

2. 遞歸每個字段得值,向Buffer寫入數據

protobuf 序列化計算過程:

1. 讀取類型,並且解析tag(會根據類型緩存)

2. 針對每個字段按tag得順序進行編碼。

1. 應用靈活性,ProtoBuffer 提供更加靈活的支持,不會隨著語言不同而不同的定義。定義一個結構體,那麽golang和c/c++的定於就需要自己調整,來保證適配,如果是其他的語言,則需要根據每個語言自己的特色來做協議的序列化和反序列化;

2. 數據長度,使用binary的結構體(大部分都會是這種情況),意味著結構體是定長的,也就是說如果你需要變長的效果,就需要一個更大容量的數組和一個數組中數據實際的長度來維護。但是整個數組在傳遞的時候依然會傳輸;

3. 效率,當protobuffer有大量零值時,protobuffer更加優秀,隨著零值得減少,binary逐漸趨近protobuffer(binary對每個字段得序列化計算損耗低於protobuffer),並且實現微弱得反超

【Golang】讀源碼知 【encode/binary】