鍦?/span>protobuf涓瓨鍦ㄥ縐嶇被鍨嬬殑鍏冩暟鎹弿榪扮被錛?/span>
1. FileDescriptor錛氬涓涓?/span>proto鏂囦歡鐨勬弿榪幫紝瀹冨寘鍚枃浠跺悕銆佸寘鍚嶃侀夐」錛堝java_package銆?/span>java_outer_classname絳夛級銆佹枃浠朵腑瀹氫箟鐨勬墍鏈?/span>message銆佹枃浠朵腑瀹氫箟鐨勬墍鏈?/span>enum銆佹枃浠朵腑瀹氫箟鐨勬墍鏈?/span>service銆佹枃浠朵腑鎵鏈夊畾涔夌殑extension銆佹枃浠朵腑瀹氫箟鐨勬墍鏈変緷璧栨枃浠訛紙import錛夌瓑銆傚湪FileDescriptor涓繕瀛樺湪涓涓?/span>DescriptorPool瀹炰緥錛屽畠淇濆瓨浜嗘墍鏈夌殑dependencies(渚濊禆鏂囦歡鐨?/span>FileDescriptor)銆?/span>name鍒?/span>GenericDescriptor鐨勬槧灝勩佸瓧孌靛埌FieldDescriptor鐨勬槧灝勩佹灇涓鵑」鍒?/span>EnumValueDescriptor鐨勬槧灝勶紝浠庤屽彲浠ヤ粠璇?/span>DescriptorPool涓煡鎵劇浉鍏崇殑淇℃伅錛屽洜鑰屽彲浠ラ氳繃鍚嶅瓧浠?/span>FileDescriptor涓煡鎵?/span>Message銆?/span>Enum銆?/span>Service銆?/span>Extensions絳夈?/span>
2. Descriptor錛氬涓涓?/span>message瀹氫箟鐨勬弿榪幫紝瀹冨寘鍚message瀹氫箟鐨勫悕瀛椼佹墍鏈夊瓧孌點佸唴宓?/span>message銆佸唴宓?/span>enum銆佸叧鑱旂殑FileDescriptor絳夈傚彲浠ヤ嬌鐢ㄥ瓧孌靛悕鎴栧瓧孌靛彿鏌ユ壘FieldDescriptor銆?/span>
3. FieldDescriptor錛氬涓涓瓧孌墊垨鎵╁睍瀛楁瀹氫箟鐨勬弿榪幫紝瀹冨寘鍚瓧孌靛悕銆佸瓧孌靛彿銆佸瓧孌電被鍨嬨佸瓧孌靛畾涔?/span>(required/optional/repeated/packed)銆侀粯璁ゅ箋佹槸鍚︽槸鎵╁睍瀛楁浠ュ強鍜屽畠鍏寵仈鐨?/span>Descriptor/FileDescriptor絳夈?/span>
4. EnumDescriptor錛氬涓涓?/span>enum瀹氫箟鐨勬弿榪幫紝瀹冨寘鍚?/span>enum鍚嶃佸叏鍚嶃佸拰瀹冨叧鑱旂殑FileDescriptor銆傚彲浠ヤ嬌鐢ㄦ灇涓鵑」鎴栨灇涓懼兼煡鎵?/span>EnumValueDescriptor銆?/span>
5. EnumValueDescriptor錛氬涓涓灇涓鵑」瀹氫箟鐨勬弿榪幫紝瀹冨寘鍚灇涓懼悕銆佹灇涓懼箋佸叧鑱旂殑EnumDescriptor/FileDescriptor絳夈?/span>
6. ServiceDescriptor錛氬涓涓?/span>service瀹氫箟鐨勬弿榪幫紝瀹冨寘鍚?/span>service鍚嶃佸叏鍚嶃佸叧鑱旂殑FileDescriptor絳夈?/span>
7. MethodDescriptor錛氬涓涓湪service涓殑method鐨勬弿榪幫紝瀹冨寘鍚?/span>method鍚嶃佸叏鍚嶃佸弬鏁扮被鍨嬨佽繑鍥炵被鍨嬨佸叧鑱旂殑FileDescriptor/ServiceDescriptor絳夈?/span>
鏈鍚庯紝protobuf緙栬瘧鐢熸垚鐨勪唬鐮佹湯灝捐繕鏈変竴涓?/span>descriptorData瀛楃涓叉暟緇勶紝瀹冩槸搴忓垪鍖栧悗鐨?/span>FileDescriptorProto鏁版嵁錛屽湪闈欐佸垵濮嬪寲鍧椾腑鍙互璋冪敤FileDescriptor.internalBuildGeneratedFileFrom()鏂規硶鏋勯犳暣涓?/span>FileDescriptor瀹炰緥錛屽湪瀹屾垚FileDescriptor鐨勬瀯閫犲悗錛岃繕浼氬洖璋冧紶鍏ョ殑InternalDescriptorAssigner瀹炰緥浠ュ垵濮嬪寲鍏朵粬鐨勯潤鎬佸瓧孌碉紝濡備互涓婃彁鍒扮殑鎵鏈夌殑闈欐佸瓧孌點?br />
鍦?/span>protobuf涓?/span>Descriptor鐨勭被鍥撅細
搴忓垪鍖栧拰鍙嶅簭鍒楀寲鏄?/span>protobuf鏈鍩虹鐨勬鏋訛紝瀹冧嬌鐢?/span>MessageLite/Message鎺ュ彛鏉ユ娊璞′竴涓彲搴忓垪鍖栫殑瀹炰緥錛?/span>騫朵笖浣跨敤Builder浠庡瓧鑺傛暟緇勬垨杈撳叆瀛楄妭嫻佷腑鏋勫緩MessageLite/Message瀹炰緥錛?/span>MessageLite鍜?/span>Message鍐呴儴閮藉畾涔変簡鑷繁鐨?/span>Builder綾伙紝浠栦滑涓瓧緇ф壙鑷?/span>MessageLiteOrBuilder浠ュ強MessageOrBuiler錛屽畠浠畾涔変簡MessageLite/Message鍜屽畠浠悇鑷?/span>Builder綾葷殑鍏卞悓鎺ュ彛銆?/span>
MessageLiteOrBuilder鎺ュ彛鍙畾涔変簡MessageLite鍜?/span>MessageLite.Builder涓や釜鎺ュ彛鍏辨湁鐨勪袱涓柟娉曪細getDefaultInstanceForType()鏂規硶鑾峰彇涓涓綋鍓嶈繕鏈垵濮嬪寲鐨勫綋鍓?/span>Message瀹炰緥(娌℃湁瀛楁琚祴鍊鹼紝鍥犺屾墍鏈夊瓧孌佃繑鍥為粯璁ゅ鹼紝瀵?/span>repeat瀛楁榪斿洖絀猴紝鍦ㄥ綋鍓?/span>protobuf 2.5.0鐨勫疄鐜頒腑錛屽畠榪斿洖鐨勬槸涓涓崟渚嬶紝鍜屾瘡涓敓鎴愮殑闈欐佹柟娉?/span>getDefaultInstance()榪斿洖鐩稿悓鐨勫疄渚?/span>)錛?/span>isInitialized()鏂規硶鐢ㄦ潵鍒ゆ柇鏄惁鎵鏈?/span>required瀛楁宸茬粡琚祴鍊箋?/span>MessageLite鎺ュ彛涓畾涔変簡涓や釜writeTo()鏂規硶鍒嗗埆灝嗗綋鍓嶅疄渚嬪簭鍒楀寲騫跺啓鍏ヨ緭鍑哄瓧鑺傛祦涓紝鑰屽彟涓涓?/span>writeDelimitedTo()鏂規硶鍒欏湪鍐欏叆涔嬪墠灝嗗綋鍓嶅疄渚嬬殑鎬婚暱搴﹀啓鍏ヨ緭鍑哄瓧鑺傛祦涓紙浠ュ彲鍙橀暱32浣?/span>Int緙栫爜鏂瑰紡錛夛紝浠庤屽彲浠ュ悓鏃跺悜涓涓緭鍑哄瓧鑺傛祦涓啓鍏ュ涓?/span>Message瀹炰緥錛?/span>MessageLite涓繕瀹氫箟浜嗚幏鍙栧綋鍓?/span>MessageLite鍦ㄥ簭鍒楀寲鎴愬瓧鑺傛祦鍚庣殑鎬誨瓧鑺傛暟鐨勬柟娉?/span>getSerializedSize()錛屼袱涓洿鎺ヨ繑鍥炲瓧鑺傛暟緇勭殑toByteArray()/toByteString()鏂規硶錛屼互鍙婅幏鍙栧畠鐨?/span>Parser瀹炰緥(getParserForType())鍜岃繑鍥炲畠鐨?/span>Builder瀹炰緥(toBuilder()錛嶅垱寤轟竴涓柊鐨?/span>Builder瀹炰緥/newBuilderForType()錛嶇敤褰撳墠MessageLite綾誨垵濮嬪寲涓涓柊鐨?/span>Builder瀹炰緥騫惰繑鍥?/span>)鏂規硶銆傚叾涓?/span>Builder鎺ュ彛鐢ㄤ簬浠庡瓧鑺傛祦鎴栧瓧鑺傛暟緇勪腑瑙f瀽騫舵瀯閫?/span>MessageLite瀵硅薄(鍚勭鐗堟湰鐨?/span>mergeFrom()鏂規硶錛屽鏋滃彂閫佺鍐欏叆浜?/span>MessageLite瀛楄妭闀垮害錛屽垯浣跨敤mergeDelimitedFrom()鏂規硶)錛屾渶鍚?/span>Builder浣跨敤build()鏂規硶鏋勯?/span>MessageLite瀵硅薄錛屾鏃跺鏋滄湁required瀛楁榪樻湭琚緗紝浼氭姏鍑?/span>UninitializedMessageException錛屼負浜嗛伩鍏嶆姏鍑哄紓甯革紝鍙互浣跨敤buildPartial()鏂規硶錛涘彟澶?/span>Builder榪樺畾涔変簡clone()鍜?/span>clear()鏂規硶錛涘湪鐢熸垚鐨勬瘡涓?/span>Message瀵硅薄涓兘瀹氫箟浜嗕竴涓?/span>newBuilder()闈欐佹柟娉曪紝涓鑸嬌鐢ㄨ闈欐佹柟娉曞垵濮嬪寲涓涓?/span>Builder瀹炰緥銆?/span>Parser鎺ュ彛涔熷畾涔変簡鍚勪釜鐗堟湰鐨?/span>parseFrom()/parsePartialFrom()/parseDelimitedFrom()/parsePartialDelimitedFrom()鏂規硶鐢ㄦ潵浠庡瓧鑺傛暟緇勬垨瀛楄妭嫻佷腑瑙f瀽鍑?/span>Message瀹炰緥錛屽湪鐢熸垚鐨勪唬鐮佷腑錛?/span>Builder鐨勫疄鐜扮洿鎺ヨ皟鐢?/span>Parser瀹炵幇綾諱腑鐨勬柟娉曘?/span>
鍦ㄥぇ閮ㄥ垎鎯呭喌涓嬶紝MessageLite宸茬粡鑳藉畬鎴愭墍鏈夌殑搴忓垪鍖栧拰鍙嶅簭鍒楀寲鎿嶄綔浜嗭紝鐗瑰埆鏄竴浜涜祫婧愭湁闄愰鎵嬫寔璁懼錛屽畠濡傛灉榪愯鏁翠釜protobuf搴撲細鏄懼緱澶楄祫婧愶紱鍙互鍦?/span>.proto鏂囦歡涓姞鍏ヤ竴涓嬫寚浠ゆ潵鍛婅瘔protobuf緙栬瘧鍣ㄥ彧闇瑕佺敓鎴愬疄鐜?/span>MessageLite鐨勭被錛?/span>
option optimize_for = LITE_RUNTIME
鐒惰屽涓鑸殑Server紼嬪簭鏉ヨ錛屾垜浠茍涓嶅湪涔庤繖鐐硅祫婧愮殑鎹熻楋紝鍥犺屼細閫夋嫨瀹炵幇Message鎺ュ彛錛屽畠鐩告瘮MessageLite錛屾坊鍔犱簡Descriptors鐩稿叧鐨勬敮鎸侊紝鍗蟲敮鎸佷嬌鐢?/span>FieldDescriptor鏉ユ瀯寤?/span>Message.Builder瀹炰緥騫舵渶緇堟瀯寤?/span>Message瀹炰緥銆?/span>
MessageOrBuilder鎺ュ彛緇ф壙鑷?/span>MessageLiteOrBuilder鎺ュ彛錛屽畠瀹氫箟浜?/span>Message鍜?/span>Message.Builder鍏辨湁鐨勬帴鍙o紝鍗蟲坊鍔犱簡Descriptor銆?/span>FieldDescriptor絳夌浉鍏崇殑鎵╁睍銆傜敱浜庡疄鐜?/span>Message鍜?/span>Message.Builder鎺ュ彛鐨勭被淇濆瓨浜嗘墍鏈?/span>Message瀹氫箟鏃跺叿鏈夌殑淇℃伅(鏂囦歡鍚嶃佸寘鍚嶃佸瓧孌靛垪琛ㄧ瓑錛屼嬌鐢ㄥ悇縐?/span>Descriptor綾繪潵鎶借薄)錛屽洜鑰屾垜浠彲浠ヤ嬌鐢?/span>Message/Message.Builder綾昏幏鍙栧埌鏇村鐨勪俊鎭紝濡備竴涓?/span>Message/Message.Builder娌℃湁璧嬪兼墍鏈?/span>required鐨勫瓧孌碉紝鍙互浣跨敤findInitializationErrors()鏂規硶鏉ヨ幏鍙栨墍鏈夋湭璧嬪肩殑瀛楁鍒楄〃(瀛楁鐨勫叏璺緞鍚嶏紝getInitializationErrorString()鏄繖涓垪琛ㄧ殑瀛楃涓插艦寮忚〃杈撅紝涓轟簡鎻愬崌鎬ц兘錛屽緩璁嬌鐢?/span>isInitialized()鏂規硶鍏堝仛鍒濇鍒ゆ柇錛屽洜涓哄畠鏇村揩)錛涘彟澶栧湪MessageOrBuilder涓繕瀹氫箟浜嗗綋鍓?/span>Message瀵瑰簲鐨?/span>Descriptor瀹炰緥錛?/span>getDescriptorForType()鏂規硶錛岃幏鍙栨墍鏈夊凡緇忚祴鍊肩殑FieldDescriptor鍒板叾鍊肩殑涓涓?/span>Map錛?/span>getAllFields()錛岄氳繃FieldDescriptor鍙栧緱鍏跺鹼細getField()錛屽垽鏂竴涓瓧孌墊槸鍚﹀凡緇忚璧嬪鹼細hasField()錛岃幏鍙?/span>repeated瀛楁鐨?/span>count錛?/span>getRepeatedFieldCount()錛岄氳繃FieldDescriptor浠ュ強index鑾峰彇repeated瀛楁鍦?/span>index澶勭殑鍊鹼細getRepeatedField()錛岃幏鍙栨湭鐭ョ殑瀛楁錛?/span>getUnknownFields()銆?/span>Message鎺ュ彛闄や簡緇ф壙鑷?/span>MessageOrBuilder鎺ュ彛鐨勬柟娉曪紝騫舵病鏈夊畾涔夊浣欑殑鏂規硶錛屽彧鏄坊鍔犱簡equals銆?/span>hashCode銆?/span>toString鏂規硶鐨勫畾涔夈傝?/span>Message.Builder鎺ュ彛闄や簡緇ф壙鑷?/span>MessageOrBuilder鎺ュ彛浠ュ錛屽畠榪樺畾涔変簡鍩轟簬FieldDescriptor鐨勬柟娉曪紝濡傞氳繃FieldDescriptor鍒涘緩/鑾峰彇Builder瀹炰緥錛?/span>newBuilderForFileld()/getFieldBuilder()錛岄氳繃FieldDescriptor璁劇疆/娓呴櫎瀛楁鐨勫鹼細setField()/clearField()/setRepeatedField()/addRepeatedField()錛屼互鍙婅緗?/span>UnknownFields錛?/span>setUnknownFields()/mergeUnknownFields()銆?/span>
MessageLite/Message綾誨浘濡備笅錛?/span>
闄や簡搴忓垪鍖栨鏋訛紝protobuf榪樺畾涔変簡涓濂楃畝鍗曠殑RPC妗嗘灦銆備箣鎵浠ヨ綆鍗曟槸鍥犱負瀹冨畾涔夌殑Service灞傛帴鍙g殑鍗忚錛岃屾病鏈夊叿浣撳拰浼犺緭鐩稿叧鐨勫疄鐜幫紝鑰屽彧鏄皢浼犺緭鐩稿叧鐨勯昏緫鎶借薄鎴?/span>RpcChannel鍜?/span>BlockingRpcChannel鍒嗗埆鐢ㄤ簬琛ㄧず鍚屾鍜屼竴姝ユ柟寮忕殑Service鏂規硶璋冪敤錛岃岃嚦浜庡簳灞傜敤浠涔堟牱鐨勫崗璁拰妗嗘灦錛岀敱鐢ㄦ埛鑷繁鍐沖畾騫跺疄鐜般?/span>
鎵璋?/span>RPC妗嗘灦錛屼粠鐢ㄦ埛瑙掑害涓婃渶鍩烘湰鐨勫氨鏄畾涔夊鎴風鍜屾湇鍔″櫒绔殑鍗忚錛屽嵆鏈嶅姟鍣ㄧ鏆撮湶鍑轟粈涔堟牱鐨勬帴鍙d緵瀹㈡埛绔皟鐢紝榪欎釜鎺ュ彛瀹氫箟浜嗘湇鍔″櫒鍦ㄤ竴涓?/span>Host鐨勬煇涓紙浜涳級绔彛涓婃帴鏀舵煇浜涜姹傛暟鎹紝騫舵湡鏈涜兘榪斿洖鐨勫搷搴斻傚叾涓湇鍔″櫒鍜岀鍙e彿灞炰簬浼犺緭瀹炵幇鐨勮寖鐣達紝protobuf鍙槸鐢?/span>RpcChannel/BlockingRpcChannel鐨勬蹇靛仛浜嗘娊璞★紝鑰屾病鏈夌粰鍑哄叿浣撳疄鐜幫紱鑰屾帴鏀舵煇涓姹傛暟鎹互鍙婃湡寰呯殑鍝嶅簲鏁版嵁錛屽湪protobuf浣跨敤Service/BlockingService鎶借薄鏉ュ畾涔夛紝騫朵笖榪欎篃鏄?/span>protobuf涓?/span>RPC妗嗘灦鐨勫畾涔夐儴鍒嗭紝鍏朵腑Service鍜?/span>RpcChannel鍏卞悓鏋勬垚寮傛鏂瑰紡鐨?/span>RPC妗嗘灦錛岃?/span>BlockingService鍜?/span>BlockingRpcChannel鍏卞悓鏋勬垚浜嗗悓姝ワ紙闃誨錛夋柟寮忕殑RPC妗嗘灦銆?/span>
浠庡簳灞傚疄鐜扮殑瑙掑害錛屼竴涓?/span>RPC璋冪敤灝辨槸瀹㈡埛绔彂閫佷竴浜涜姹傛暟鎹粰鏈嶅姟鍣紝鏈嶅姟鍣ㄨВ鏋愬茍澶勭悊榪欎簺璇鋒眰鏁版嵁錛岀劧鍚庡皢鍝嶅簲鏁版嵁榪斿洖緇欏鎴風銆備負浜嗛殣钘忓唴閮ㄥ疄鐜扮粏鑺傦紝鎻愬崌鍐欎唬鐮佺殑鏁堢巼錛?/span>RPC灝嗚繖涓榪囩▼灝佽鎴愭柟娉曡皟鐢紝鍗充笉鍚岀殑璇鋒眰鐢ㄤ笉鍚岀殑鏂規硶琛ㄨ揪錛岃繖灝辨槸protobuf涓?/span>RPC鐨勫畾涔夈傚湪protobuf涓紝瀹氫箟涓涓?/span>PRC鎺ュ彛姣旇緝綆鍗曪細棣栧厛寮鍚?/span>RPC鍔熻兘錛岀劧鍚庣敤service鍏抽敭瀛楀畾涔変竴涓帴鍙o紝鍦ㄦ帴鍙d腑浣跨敤rpc鍏抽敭瀛楀畾涔変竴涓柟娉曪紝鏂規硶鍖呭惈鏂規硶鍚嶃佹柟娉曞弬鏁般佽繑鍥炲鹼紝鍏朵腑鏂規硶鍙傛暟鍜岃繑鍥炲奸兘蹇呴』鏄竴涓?/span>message綾誨瀷錛屽茍涓斿彧鑳芥湁涓涓細
鍦?/span>protobuf緙栬瘧鐢熸垚鐨勪唬鐮佷腑錛屽畠浼氱敓鎴愪竴涓?/span>MyService鎶借薄綾誨疄鐜頒簡Service鎺ュ彛錛屼竴鑸畠鍙槸浣滀負涓涓懡鍚嶇┖闂達紝瀹冨唴閮ㄥ畾涔変簡涓や釜鎺ュ彛錛?/span>Interface鍜?/span>BlockingInterface鏈埆緇ф壙鑷?/span>Service鎺ュ彛鍜?/span>BlockingService鎺ュ彛錛岀敤浜庢娊璞″紓姝ュ拰鍚屾鏂瑰紡鐨?/span>RPC鏂規硶璋冪敤錛涜繖涓や釜鎺ュ彛鏈変袱涓疄鐜扮被錛?/span>Stub鍜?/span>BlockingStub錛屼粬浠垎鍒帴鏀?/span>RpcChannel鍜?/span>BlockingRpcChannel瀹炰緥浣滀負鏋勯犲嚱鏁板弬鏁幫紝鍙互浣跨敤MyService涓殑闈欐佹柟娉?/span>newStub()鍜?/span>newBlockingStub()鏂規硶鑾峰彇浠栦滑鍚勮嚜瀹炰緥錛屼粬浠富瑕佺敤浜庡鎴風鐨勮皟鐢ㄣ傚湪鐢熸垚鐨?/span>request鏂規硶涓紝闄や簡request鏈韓鐨勫弬鏁幫紝榪樻湁涓涓?/span>RpcController鍙傛暟錛屽畠鐢ㄤ簬澶勭悊鍦?/span>RpcChannel/BlockingRpcChannel璋冪敤涓殑鐘舵佸鐞嗭紝濡傞敊璇鐞嗙瓑錛屼嬌鐢ㄥ畠鍙互鑾風煡姝ゆ璋冪敤鏄惁鍑洪敊錛岄敊璇俊鎭槸浠涔堢瓑銆傚湪MyService涓繕瀹氫箟浜嗕袱涓潤鎬佹柟娉?/span>newReflectiveService/newReflectiveBlockingService錛屼粬浠帴鏀?/span>Interface/BlockingInterface瀹炰緥錛屽茍榪斿洖Service/BlockingService鐨勫疄鐜板疄渚嬶紙鏆傛椂榪樻病鏈夋兂鍒頒嬌鐢ㄤ粬浠殑鍦烘櫙錛夈?/span>
鍦?/span>MyService鐨?/span>RPC妗嗘灦瀹炵幇涓紝鍦ㄦ湇鍔″櫒绔紝瀹炵幇MyService.Interface/MyService.BlockingInterface鎺ュ彛錛岀劧鍚庡皢瀹冩敞鍐屽埌瀵?/span>RpcChannel/BlockingRpcChannel妗嗘灦鐨勫疄鐜頒腑錛涘湪瀹㈡埛绔垯鍒涘緩涓涓?/span>RpcChannel/BlockingRpcChannel瀹炰緥錛屼紶鍏?/span>MyService.newStub()/MyService.newBlockingStub()鏂規硶鑾峰彇瀵瑰簲鐨勫疄渚嬶紝鐒跺悗浣跨敤榪欎釜Stub/BlockingStub瀹炰緥璋冪敤鐩稿簲鐨勬柟娉曞嵆鍙?/span>