2016-12-20 9 views
6

Google प्रोटोकॉल बफर 3.0 में विरासत को कैसे संभालें?प्रोटोकॉल बफर में विरासत

जावा बराबर कोड:

public class Bar { 
    String name; 
} 
public class Foo extends Bar { 
    String id; 
} 

क्या आद्य बराबर कोड हो सकता है?

message Bar { 
    string name = 1; 
} 
message Foo { 
    string id = 2; 
} 
+1

विरासत प्रोटोकॉल बफर में समर्थित नहीं है। यह http://stackoverflow.com/questions/29263507/extending-protobuf- संदेश – Yousaf

उत्तर

4

देखें Protocol Buffer Basics ट्यूटोरियल:

वर्ग विरासत के लिए इसी तरह की सुविधा की तलाश में मत जाओ, हालांकि - प्रोटोकॉल बफ़र्स कि ऐसा नहीं करते हैं।

+0

कोई विचार क्यों वे ऐसा नहीं करते हैं? मेरा मतलब है, यह कुछ ऐसा नहीं लगता है जो वे जोड़ना चाहते हैं, यहां तक ​​कि भविष्य में भी –

+0

मैं सोचता हूं * इसके परिणामस्वरूप क्षमताएं हो सकती हैं। पोर्टो-बफर की मुख्य विशेषता में से एक चीजों को कुशलता से पैक करना है। एक चर को आवंटित पूर्णांक का निचला मान अनुकूलित पैकिंग सुनिश्चित करता है और दूसरी बात यह है कि उन्हें अद्वितीय होना चाहिए। अब जब विरासत के कई स्तर बनाए जाते हैं, तो आधार संरचनाओं में गुणों को आवंटित पूर्णांक का ट्रैक रखना मुश्किल होगा .. –

6

प्रोटोकॉल बफर विरासत का समर्थन नहीं करता है। , कि कहा, वहाँ एक चाल आप उपयोग कर सकते हैं जो विरासत की तरह है

message Foo { 
    Bar bar = 1; 
    string id = 2; 
} 

हालांकि - लेकिन जो एक बदसूरत हैक है ताकि आप केवल यह ध्यान के साथ उपयोग करना चाहिए: इसके बजाय, रचना का उपयोग करें। आपके द्वारा निर्धारित यदि आपके संदेश प्रकारों की तरह:

message Bar { 
    string name = 1; 
} 
message Foo { 
    string name = 1; 
    string id = 2; 
} 

इन दो प्रकार के संगत हैं, क्योंकि FooBar के क्षेत्र के एक सुपरसेट शामिल हैं। इसका अर्थ यह है कि यदि आपके पास एक प्रकार का एन्कोडेड संदेश है, तो आप इसे दूसरे प्रकार के रूप में डीकोड कर सकते हैं। यदि आप Bar को Foo टाइप करने का प्रयास करते हैं, तो फ़ील्ड id सेट नहीं किया जाएगा (और इसका डिफ़ॉल्ट मान प्राप्त होगा)। यदि आप Foo को Bar टाइप करते हैं, तो फ़ील्ड id को अनदेखा कर दिया जाएगा। (ध्यान दें कि ये वही नियम हैं जो समय के साथ एक प्रकार में नए फ़ील्ड जोड़ते समय लागू होते हैं।)

आप संभवतः इस तरह का उपयोग विरासत की तरह कुछ लागू करने के लिए कर सकते हैं, जिसमें कई प्रकार के होते हैं जिनमें से सभी के खेतों की एक प्रति होती है "superclass"। हालांकि, इस दृष्टिकोण के साथ एक जोड़ी बड़ी समस्या हैं:

  • प्रकार Foo का संदेश वस्तु परिवर्तित करने के लिए टाइप करने के लिए Bar, आप को क्रमानुसार और फिर से पार्स करने के लिए है; आप सिर्फ कास्ट नहीं कर सकते हैं। यह अक्षम हो सकता है।
  • सुपरक्लास में नए फ़ील्ड जोड़ने में बहुत मुश्किल है, क्योंकि आपको यह सुनिश्चित करना होगा कि प्रत्येक उपclass में फ़ील्ड जोड़ना है और यह सुनिश्चित करना है कि इससे कोई फ़ील्ड नंबर विवाद नहीं हो।
संबंधित मुद्दे