2013-04-09 11 views
19

protobufで構造体をシリアル化しようとしています。多くの時間は、私が間違ってやっているかを把握しようとした後、私はGoogleの例をテストすることを決定し、それは同様に protobufでシリアル化エラー

を働いていなかった私持っている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; 
} 

そして私はそれをシリアル化しようとしている:

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

使用しているライブラリと一致する 'protoc'のバージョンを使用しましたか? –

+2

私はprotobufのさまざまなバージョンを使用していた...ありがとうございましたマーク! – Fynn

答えて

28

Marc氏によると、プロトコルバッファバージョンの不一致がこの正確なメッセージを伝えます。特に、.protoの定義は、2.4.3(またはそれ以前)を使用してJavaに変換され

  • 場合は、あなたがこれを取得します

ライブラリ2.5.0 protobuffersを使用

  • をprotoc.exeクラスGeneratedMessageの多くのメソッド(例えば、getParserForType、getUnknownFields)のメッセージ。間違いなく他の潜在的な不一致のプロトコルバッファ2.5.0それは不可欠であると、このエラー


    の原因となりますことをありませんあなたはprotocの2.5.0バージョンですべてのJavaクラスを再生成(または上Windowsのprotoc.exe)。


    あなたは逆行う場合 - プロトコルバッファバージョン2.4用のライブラリでprotocバージョン2.5によって生成された実行コードを。以下のメッセージが表示されます

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

    しかし私はこのメッセージをprotobufでもjava libは2.5.0 – Adelin

    +0

    です@Adioあなたは2.5.0でprotobufクラスを生成しましたか?このメッセージはprotobuf-javaクラスが以前のバージョンのjavaで.proto定義から生成された場合に発生します。私はこれをより明確にするために私の答えを更新します –

    +7

    これは驚くべきことです。 protocがバージョン2.4.1のUbuntuにあり、プロジェクトのprotobuf-javaにバージョン2.5.0があるので、プロトコルのバッファを使用してバージョンの依存関係を解消する予定でしたが、今は何も動作しません。プラスのメッセージ "これはサブクラスによってオーバーライドされるはずです"とは、実際の問題の理由を説明するのが実際には面倒です。 – divanov

    関連する問題