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