2013-04-09 35 views
19

Tôi đang cố gắng tuần tự hóa cấu trúc với protobuf. sau nhiều giờ cố gắng tìm ra những gì tôi đang làm sai tôi quyết định thử nghiệm ví dụ của google và nó đã không làm việc cũnglỗi với tuần tự hóa với protobuf

Tôi có giao thức sau đây từ google (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; 
} 

và tôi đang cố gắng để serialize nó với:

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

byte [] đăng = john.toByteArray();

và tôi nhận được "java.lang.UnsupportedOperationException: Điều này được cho là bị ghi đè bởi các lớp con".

Cảm ơn;

+1

Bạn có thể đăng toàn bộ ngăn xếp không? – rongenre

+5

Bạn có sử dụng phiên bản 'protoc' khớp với thư viện bạn đang sử dụng không? –

+2

Tôi đã sử dụng các phiên bản khác nhau của protobuf ... Cảm ơn rất nhiều Marc! – Fynn

Trả lời

28

Như Marc đã nói, Sự không khớp trong các phiên bản Protocol Buffer sẽ cung cấp cho bạn thông điệp chính xác này. Đặc biệt nếu

  • Các .proto định nghĩa được chuyển đổi sang sử dụng java 2.4.3 (hoặc sớm hơn) protoc.exe
  • Bạn sử dụng thư viện 2.5.0 protobuffers

bạn sẽ có được điều này thư trong nhiều phương thức (ví dụ getParserForType, getUnknownFields) của lớp GeneratedMessage. Không có nghi ngờ gì khác tiềm năng không phù hợp rằng sẽ gây ra lỗi này


Với đệm giao thức 2.5.0 nó là cần thiết bạn tái sinh mọi tầng lớp java với phiên bản 2.5.0 của protoc (hoặc trên cửa sổ protoc.exe).


Nếu bạn làm điều ngược lại - chạy mã được tạo ra bởi phiên bản protoc 2,5 với các thư viện cho giao thức đệm phiên bản 2.4. Bạn sẽ nhận được thông báo sau

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

Nhưng tôi nhận được thông báo này ngay cả protobuf và java lib là 2.5.0 – Adelin

+0

@Adio bạn đã tạo lớp protobuf với 2.5.0 chưa. Thông báo này xảy ra khi lớp protobuf-java được tạo ra từ định nghĩa .proto với một phiên bản trước của java. Tôi sẽ cập nhật câu trả lời của tôi để làm cho điều này rõ ràng hơn –

+7

Đây là loại tuyệt vời. Tôi đã có kế hoạch sử dụng bộ đệm giao thức để loại bỏ phụ thuộc phiên bản và bây giờ tôi không có bất cứ điều gì làm việc vì protoc là trong Ubuntu của phiên bản 2.4.1 và protobuf-java trong dự án có phiên bản 2.5.0. Thêm tin nhắn "Đây là nghĩa vụ phải được ghi đè bởi các lớp con" thực sự là tệ hại trong việc mô tả lý do thực sự cho một vấn đề. – divanov

Các vấn đề liên quan