3

protobuff 形式でシリアル化されたデータがあり、それを Avro シリアル化に変換したいと考えています。

を使用してプロトデータを読み取るのに問題はありません

    ProtoTest.Msg msg = buildMessage();
    ProtobufData protobufData = ProtobufData.get();
    Schema protoSchema = protobufData.getSchema(ProtoTest.Msg.class);
    Object o = protobufData.newRecord(msg, protoSchema);

結果のoは、再び protobuf オブジェクトです。今、同じスキーマで avro としてoを書きたい

    GenericDatumWriter genericDatumWriter = new GenericDatumWriter(protoSchema);
    OutputStream out = new ByteArrayOutputStream();
    Encoder encoder = EncoderFactory.get().binaryEncoder(out, null );
    genericDatumWriter.write(o, encoder);

しかし、上記のコードを実行すると、書き込みメソッドで次の例外がスローされます

java.lang.ClassCastException: example.avro.ProtoTest$Msg cannot be cast to org.apache.avro.generic.IndexedRecord
at org.apache.avro.generic.GenericData.getField(GenericData.java:526)
at org.apache.avro.generic.GenericData.getField(GenericData.java:541)
at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)
at hermes.mediationOrchestrator.AvroFileWriteTest.testWriter3(AvroFileWriteTest.java:115)

proto オブジェクトを avro オブジェクトに変換するにはどうすればよいですか?

よろしく、ローネン。

4

1 に答える 1

2

GenericDatumWriter の代わりに ProtobufDatumWriter を使用する必要があります。

http://avro.apache.org/docs/current/api/java/org/apache/avro/protobuf/ProtobufDatumWriter.html

また、ProtobufDatumReader を使用して protobuf データを読み取ります。

最後に、Avro の質問は、Avro のメーリング リストでより迅速に回答されます。

http://avro.apache.org/mailing_lists.html

于 2014-01-24T19:55:32.803 に答える