将protobuf转换为avro

时间:2013-07-03 11:31:48

标签: protocol-buffers avro

我有以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对象。现在我想用相同的架构写 o 作为avro

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

但是运行上面的代码会在 write 方法

中抛出下一个异常
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对象?

此致   RONEN。

1 个答案:

答案 0 :(得分:2)

您应该使用ProtobufDatumWriter而不是GenericDatumWriter。

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