2014-11-11 7 views
5

.proto उदाहरण सभी अपने फ़ील्ड को एक नंबर पर शुरू करना शुरू करते हैं।Can .proto फ़ाइलों के फ़ील्ड शून्य से शुरू हो सकते हैं?

उदा शून्य इस्तेमाल किया जा सकता https://developers.google.com/protocol-buffers/docs/proto#simple

message SearchRequest { 
    required string query = 1; 
    optional int32 page_number = 2; 
    optional int32 result_per_page = 3; 
} 

हैं, तो यह कुछ संदेश एक या अधिक बाइट्स छोटे हो जाएंगे (अर्थात 16 की एक एक या अधिक क्षेत्र संख्या के साथ)।

कुंजी के रूप में बस एक varint एन्कोडिंग है (fieldnum < < 3 | fieldtype) मैं तुरंत नहीं देख सकता कि शून्य का उपयोग क्यों नहीं किया जाना चाहिए।

क्या शून्य पर फ़ील्ड नंबरिंग शुरू करने का कोई कारण नहीं है?

+1

मैं इस सवाल को करने वाला था क्योंकि हम प्रोग्रामर के रूप में शून्य पर शुरू करने के लिए उपयोग किए जाते हैं। पूछने के लिए धन्यवाद! – Sericaia

उत्तर

5

एक बहुत ही तत्काल कारण यह है कि शून्य क्षेत्र संख्या protoc द्वारा अस्वीकार कर दिया जाता है:

test.proto:2:28: Field numbers must be positive integers. 

क्यों प्रोटोकॉल बफ़र इस तरह से डिजाइन किया गया है के रूप में, मैं केवल अनुमान लगा सकते हैं। इसका एक अच्छा परिणाम यह है कि शून्य से भरा एक संदेश अमान्य के रूप में पहचाना जाएगा। इसका उपयोग प्रोटोकॉल बफर कार्यान्वयन में वापसी मूल्य के रूप में आंतरिक रूप से "कोई फ़ील्ड" इंगित करने के लिए भी किया जा सकता है।

+0

आह, मुझे यह एहसास नहीं हुआ था, क्योंकि मैं प्रोटोबफ के साथ काम करने के लिए अपनी जेएस लाइब्रेरी का उपयोग करता हूं। मैं शून्य फ़ील्ड नंबर भी अवैध बना दूंगा। – fadedbee

+1

पुराना प्रोटो 1 कोड (सार्वजनिक रूप से कभी जारी नहीं किया गया) में टिप्पणियां थीं कि टैग शून्य का उपयोग किसी त्रुटि को इंगित करने के लिए किया जा सकता है, हालांकि मैंने कभी ऐसा कोड नहीं देखा जो वास्तव में ऐसा करता था। हो सकता है कि यह एक फीचर बहुत जल्दी था जिसे हटा दिया गया था। किसी भी मामले में, शून्य-क्रमांकित फ़ील्ड पर निषेध रुक गया, और तर्कसंगत रूप से यह उपयोगी है कि यह उन लोगों को पकड़ लेता है जो अपने प्रोटोबफ संदेशों को शून्य-पैड शून्य-पैड करते हैं और उम्मीद करते हैं कि वे अभी भी सही तरीके से पार्स करें (जो बहुत कुछ होता है!)। –

1

नियत टैग

आप देख सकते हैं, संदेश परिभाषा प्रत्येक क्षेत्र के लिए एक अनूठा क्रमांकित टैग है। इन टैग का उपयोग संदेश बाइनरी प्रारूप में आपके फ़ील्ड को पहचानने के लिए किया जाता है, और आपके संदेश प्रकार का उपयोग होने के बाद इसे बदला नहीं जाना चाहिए। ध्यान दें कि 1 से 15 तक के मानों वाले टैग एन्कोड करने के लिए एक बाइट लेते हैं, जिसमें पहचान संख्या और फ़ील्ड के प्रकार (आप प्रोटोकॉल बफर एन्कोडिंग में इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं) शामिल हैं। 16 से 2047 की श्रेणी में टैग दो बाइट लेते हैं। तो आपको अक्सर संदेश तत्वों के लिए टैग 1 से 15 तक आरक्षित करना चाहिए। अक्सर आने वाले तत्वों के लिए कुछ जगह छोड़ना याद रखें जो भविष्य में जोड़े जा सकते हैं।

सबसे छोटा टैग नंबर जो आप निर्दिष्ट कर सकते हैं वह 1 है, और सबसे बड़ा 2 -1, या 536,870,911 है। आप प्रोटोकॉल बफर कार्यान्वयन के लिए आरक्षित हैं क्योंकि प्रोटोकॉल बफर कार्यान्वयन के लिए आरक्षित हैं, क्योंकि आप प्रोटोकॉल बफर कार्यान्वयन के लिए आरक्षित हैं - प्रोटोकॉल बफर कंपाइलर शिकायत करेंगे यदि आप अपने .proto में इन आरक्षित संख्याओं में से किसी एक का उपयोग करते हैं तो आप 1 99 3 से 199 99 (फ़ील्डडिस्क्रिप्टर :: kFirstReservedNumber के माध्यम से फील्डडिस्क्रिप्टर :: kLastReservedNumber) का उपयोग नहीं कर सकते हैं। इसी प्रकार, आप किसी भी पहले आरक्षित टैग का उपयोग नहीं कर सकते हैं।

https://developers.google.com/protocol-buffers/docs/proto

दस्तावेज़ वैसे ही जैसे कहते हैं, 0 नहीं पाया जा सकता है।

संबंधित मुद्दे