web-dev-qa-db-ja.com

protobufを使用したシリアル化のエラー

Protobufを使用して構造をシリアル化しようとしています。私が間違っていることを理解しようと何時間も試みた後、私はグーグルの例をテストすることに決めました、そしてそれはうまくいきませんでした

私はグーグルから次のプロトコルを持っています( 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();

byte [] serialized = john.toByteArray();

「Java.lang.UnsupportedOperationException:これはサブクラスによってオーバーライドされることになっています」というメッセージが表示されます。

ありがとう;

20
Fynn

マークが言ったように、プロトコルバッファバージョンの不一致はあなたにこの正確なメッセージを与えるでしょう。特に

  • .proto定義は、2.4.3(またはそれ以前)のprotoc.exeを使用してJava
  • 2.5.0protobuffersライブラリを使用します

このメッセージは、クラスGeneratedMessageの多くのメソッド(getParserForType、getUnknownFieldsなど)で表示されます。このエラーを引き起こす可能性のある他の不一致は間違いありません


プロトコルバッファ2.5.の場合必須あなた再生成すべてJava 2.5.0バージョンのクラスprotoc(またはWindows protoc.exe)の。


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

Java.lang.VerifyError: class xxx.xxx.xx.. 
overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
28
Bruce Martin