序列化和反序列化在日常工做中會大量使用,然而並不必定很是清楚它的概念。序列化和反序列化的選型倒是系統設計或重構一個重要的環節,在分佈式、大數據量系統設計裏面更爲顯著。機器間的通訊須要約定一個協議,序列化和反序列化是這個通訊協議的一部分。
序列化
:將對象或數據結構轉爲字節序列的過程。
反序列化
:將序列化後生成的字節序列轉爲對象或數據結構的過程。分佈式
比較常見的序列化和反序列化組方式有XML、JSON和Protobuf等。XML標準化較早,基於XML的SOAP是一種應用普遍的結構化數據傳遞協議。JSON源於js,較之XML它更小、解析更快,並且一樣具有可讀性好的優勢。而源於谷歌的protobuf如今在大型分佈式系統普遍使用。大數據
Protobuf是谷歌推出的一款平臺無關,語言無關,可擴展的序列化和反序列化技術。ui
要使用Protobuf,首先須要定義.proto文件
以下proto2
中:編碼
message msg { required int32 a=1; optional string b=2; repeated string c=3; }
其中:spa
而在proto3
中,字段規則中去除了required和optional,增長singular。可是proto3仍兼容proto2
。設計
message msg { int32 a=1; singular string b=2; repeated string c=3; }
其中,code
一個較完整的.proto文件對象
syntax = "proto3"; message Article { int32 article_id = 1; singular string article_excerpt = 2; repeated string article_picture = 3; singular int32 article_pagecount = 4 [default = 0]; enum ArticleType { NOVEL = 0; PROSE = 1; PAPER = 2; POETRY = 3; } singular ArticleType article_type = 5 [default = NOVEL]; message Author { string name = 1; singular string phone = 2; } singular Author author = 6; repeated int32 article_numberofwords = 7 [packed=true]; reserved 9, 10, 12 to 15; extensions 100 to 1000; } extend Article { singular int32 followers_count = 101; singular int32 likes_count= 102; } message Other { singular string other_info = 1; oneof test_oneof { string code1 = 2; string code2 = 3; } }
咱們總不能都定義在一個文件中。當一個proto文件須要另外一個proto文件的時候,咱們能夠經過import導入。protobuf也提供了包的定義,只要在文件開頭定義package關鍵字便可。string
import "test.proto" package foo.bar;
針對不一樣語言,依據.proto文件編譯成咱們須要的語言文件。如C++下
protoc -I=SRC_DIR --cpp_out=DST_DIR SRC_DIR/ex.proto
先簡單記錄這些。