接下來是定義message屬性,一個message是包含了各種類型字段的聚集。有很多標準的變量類型可以使用,包 括:bool,int32,float,double和string。你也可以使用其他的message作為字段類型。正像例子中的Person包含了 PhoneNumber,而AddressBook包含了Persion。甚至可以在message內部定義message,例 如:PhoneNumber就是在Persion里面定義的。你還可以定義enum類型,正像指定電話號碼類型的MOBILE、HOME、WORK。
其中“=1”,“=2”表示每個元素的標識號,它會用在二進制編碼中對域的標識。標識號1-15由于使用時會比那些高的標識號少一個字節,從最優化 角度考慮,可以將其使用在一些較常用的或repeated元素上,對于16以上的則使用在不常用的或optional的元素上。對于repeated的每 個元素都需要重復編碼該標識號,所以repeated的域進行優化來說是最顯示的。
每個字段必須提供一個修飾詞:
Ø required:表示字段必須提供,不能為空。否則message會被認為是未初始化的,試圖build未初始化的message會拋出 RuntimeException。解析未初始化的message會拋出IOException。除此之外,一個required字段與optional 字段完全相同。
Ø optional:可選字段,可以設置也可以不設置。如果沒有設置,會設置一個缺省值。可以指定一個缺省值,正像電話號碼的type字段。否則,使用系統 的缺省值:數字類型缺省為0;字符類型缺省為空串;邏輯類型缺省為false;對于嵌入的message,缺省值通常是message的實例或原型。
Ø repeated:字段可以被重復(包括0),可等同于動態數組或列表。其中存儲的值列表的順序是被保留的。
Required修飾的字段是永久性的,在使用該修飾符時一定要特別小心。如果在以后想要修改required域為optional域時會出現問 題。對于訪問舊接口的用戶來說沒有該字段時,將會認為是不合法的訪問,將會被拒絕或丟棄。其中google的一些工程師給出的建議是如果不是必須,就盡量 少用required修飾符。