2013-04-09 7 views
19

के साथ क्रमबद्धता के साथ त्रुटि मैं प्रोटोबफ के साथ एक संरचना को क्रमबद्ध करने की कोशिश कर रहा हूं। कई घंटे के बाद मैं गलत क्या कर रहा पता लगाने की कोशिश मैं गूगल के उदाहरण परीक्षण करने का फैसला है और यह रूप में अच्छी तरह से काम नहीं किया थाप्रोटोबफ

मैं गूगल से निम्नलिखित प्रोटोकॉल (https://developers.google.com/protocol-buffers/docs/javatutorial):

package tutorial; 
option java_package = "com.example.tutorial"; 
option java_outer_classname = "AddressBookProtos"; 

message Person { 
    required string name = 1; 
    required int32 id = 2; 
    optional string email = 3; 
    repeated PhoneNumber phone = 4; 

    enum PhoneType { 
     MOBILE = 0; 
     HOME = 1; 
     WORK = 2; 
    } 

    message PhoneNumber { 
     required string number = 1; 
     optional PhoneType type = 2 [default = HOME]; 
    } 
} 

message AddressBook { 
    repeated Person person = 1; 
} 

और मैं के साथ यह क्रमानुसार करने कोशिश कर रहा हूँ:

Person john = Person.newBuilder() 
    .setId(1234) 
    .setName("John Doe") 
    .setEmail("[email protected]") 
    .addPhone(
     Person.PhoneNumber.newBuilder() 
      .setNumber("555-4321") 
      .setType(Person.PhoneType.HOME)) 
    .build(); 

बाइट [] धारावाहिक = john.toByteArray();

और मुझे "java.lang.UnsupportedOperationException: यह सबक्लास द्वारा ओवरराइड किया जाना चाहिए।"

धन्यवाद;

+1

क्या आप पूर्ण स्टैकट्रैक पोस्ट कर सकते हैं? – rongenre

+5

क्या आपने 'प्रोटोक' के एक संस्करण का उपयोग किया था जो आपके द्वारा उपयोग की जा रही लाइब्रेरी से मेल खाता है? –

+2

मैं protobuf के विभिन्न संस्करणों का उपयोग कर रहा था ... धन्यवाद बहुत मार्क! – Fynn

उत्तर

28

जैसा कि मार्क ने कहा, प्रोटोकॉल बफर संस्करणों में एक विसंगति आपको यह सटीक संदेश देगी। विशेष रूप से

  • .proto परिभाषा 2.4.3 (या पुराने) protoc.exe
  • आप 2.5.0 protobuffers लाइब्रेरी का उपयोग

आप इस मिल जाएगा का उपयोग कर जावा में बदल जाती है, तो कक्षा जेनरेटेड मैसेज के कई तरीकों से संदेश (जैसे GetParserForType, getUnknownFields)। इसमें कोई शक नहीं अन्य संभावित बेमेल की है कि इस त्रुटि


कारण होगा प्रोटोकॉल बफ़र्स 2.5.0 यह आवश्यक है के साथ कर रहे हैं आप या protoc की 2.5.0 संस्करण के साथ सभी जावा वर्गों को पुनर्जीवित (पर विंडोज protoc.exe)।


आप रिवर्स करते हैं - चलाने के कोड protoc संस्करण द्वारा उत्पन्न 2.5प्रोटोकॉल के लिए पुस्तकालयों के साथ संस्करण 2.4 बफ़र्स। आपको निम्न संदेश

java.lang.VerifyError: class xxx.xxx.xx.. 
overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet; 
+0

लेकिन मुझे यह संदेश भी मिलता है प्रोटोबफ और जावा लिब 2.5.0 – Adelin

+0

@Adio ने 2.5.0 के साथ प्रोटोबफ क्लास उत्पन्न किया था। यह संदेश तब होता है जब प्रोटोबफ-जावा क्लास जावा के पूर्व संस्करण के साथ .proto परिभाषा से उत्पन्न होता है। मैं इस स्पष्ट –

+7

को बनाने के लिए अपना उत्तर अपडेट करूंगा यह आश्चर्यजनक है। मैं संस्करण निर्भरताओं को खत्म करने के लिए प्रोटोकॉल बफर का उपयोग करने की योजना बना रहा था और अब मेरे पास कुछ भी काम नहीं है क्योंकि प्रोटोकॉल संस्करण 2.4.1 के उबंटू में है और प्रोजेक्ट में प्रोटोबफ-जावा संस्करण 2.5.0 है। प्लस संदेश "यह सबक्लास द्वारा ओवरराइड किया जाना चाहिए" एक समस्या के वास्तविक कारण का वर्णन करने में वास्तव में लुसी है। – divanov

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