1. 程式人生 > >Netty學習(2): protobuf序列化框架學習

Netty學習(2): protobuf序列化框架學習

1. protobuf是什麼

    protobuf是google旗下的產品,用於序列化與反序列化資料結構,但是比xml更小、更快、更簡單,而且能跨語言、跨平臺。你可以把你的資料按你的要求結構化,然後可以轉化成多種資料流,同時其他語言可以通過不同的流轉化成自己熟悉的語言的資料格式。如C++語言開發者,定義了一個User資料結構,java開發者可以把此資料流輕易的轉化成java環境下的資料結構。

    我們知道json比xml更輕便,json格式的資料大小是xml的1/20,然後protobuf又是json的1/10,所以對資料大小要求高的選擇protobuf合適;同時protobuff序列化與反序列化速度更快,所以對速度要求高的,可以選擇protobuf;最關鍵一點,讓我選擇protobuf的原因是,它是向後相容的,也就是說你可以對你的訊息體進行修改,新舊版本之間相互相容,而xml與json不容易做到這一點。

    protobuf的缺點是可讀性差,不結合protobuf訊息結構,是沒辦法讀懂資料流的,這也是為獲得輕便、高效做出的妥協。

2.它是如何工作的

    它是怎麼工作的呢,首先要把所有資料結構通過一個簡單易懂的“.proto”檔案定義,然後再把這個檔案,通過Protocol buffer編譯器編譯成相應的類(C++、java、go等)檔案。然後開發的時候,可以直接呼叫類檔案中的介面,進行讀、寫、序列化與反序列化等操作。也就是說,首先它有一個任何語言開發者都易懂的規範文字(.proto),按此規範定義資料結構,然後用一個工具翻譯成自己熟悉的語言的類檔案,通過此類檔案可以簡單的操作資料。

3.如何學習protobuf

    學習protobuf非常簡單,首先你得學會寫簡單的“.proto”檔案,也就是用protobuf語法描述你的資料結構,得先學習基本的protobuf語法,這樣你就能定義自己的資料結構,所以我將在第二部分介紹protobuf的語法。其次,當你有自己的“.protobuf”檔案後,你要把檔案編譯成你熟悉的開發語言(C++、java、python等)的資料結構類檔案,所以你要一個編譯器,在第三章節,我將介紹如何通過官方的原始碼獲得編譯器,然後如何把proto檔案編譯成C++類檔案。最後,是如何利用生成的C++類檔案,序列化與反序列化資料,與一些常用的方法與注意事項,將在最後一章節中介紹。

4.示例proto檔案

player.proto檔案

option java_package = "com.proto";
option java_outer_classname = "PlayerModule";

message PBPlayer{
	required int64 playerId = 1;
	
	required int32 age = 2;
	
	required string name = 3;
	
	repeated int32 skills = 4;
}

message PBResource{
	required int64 gold = 1;
	
	required int32 energy = 2;
}