最近在做一個基於Netty框架的項目。
該項目使用了Google的Protobuf作爲編解碼的框架。(沒有使用XML或者json是爲了更好的提高效率)。
經過了一段時間的使用我對Protobuf的原始文件進行一個簡單的使用方法總結。
我主要在這裏說明一下,原始文件.proto中,修飾符repeated、required、optional的區別。
0.windows環境,java工程
1.安裝protobuf後,找到protoc.exe
2.寫一個配置文件進行批處理(.bat),如下圖所示
3.寫一個proto文件,如:
package trade;
message Testq{
required string deal_no=1;
required string client_id=2;
}
(注意:此處之後要進行修飾符repeated、required、optional的區別比較,因此會不斷的修改proto文件。)
4.開始進行比較。
4.1使用repeated和不使用repeated的區別。
repeated 就是說該字段是指定類型的數組。在java中是一個list,也就說,在調用的時候可以調用一個list集合,不需要一個一個的調用了,這樣做很方便。下面我們來看圖,進行詳細的說明:
4.1.1配置文件的比較,
下面看看在java中的區別:
首先我們會看待到,在java中增加了public interface TestsOrBuilder的這些代碼,然後會看到,java.util.List<trade.Test.Testq> getTestsList();的代碼,這段代碼說明增加了repeated修飾符之後,生成的java代碼爲list類型。
然後,我們會在697行找到Testq的代碼,因此,增加了repeated修飾之後,也會增加600多行代碼。詳見下圖:
然後在下方還會發現,不同,詳見下圖:
例如會在有repeated的文件中增加,internal_static_trade_Tests_descriptor的代碼片段
還會增加對於list的簡單描述。
4.2 關於requird和optional修飾符的區別
先看配置文件,如下圖:
再來看生成的java代碼的區別:
首先會調整說明註釋,如下圖
然後,關鍵代碼也會進行調整,如下圖:不一樣的代碼required和optional-1
不一樣的代碼required和optional-2
不一樣的代碼required和optional-3
通過代碼我們可以看出,required的選項應該表示該字段必選,optional表示可先。
最後那個\001 和\002的區別,我查到了之後再補充吧。
這個是在網上找的一段關於這個\002的說明,有懂的人幫着確認或者解釋一下吧。
Control Characters
CTRL (^D means to hold the CTRL key and hit d)
Oct Dec Char Hex Key Comments
\000 0 NUL \x00 ^@ \0 (Null byte)
\001 1 SOH \x01 ^A (Start of heading)
\002 2 STX \x02 ^B (Start of text)