Bijection - Java Avro序列化

时间:2016-08-05 10:58:54

标签: serialization apache-kafka avro bijection

我正在寻找一个示例,在类似于SpecificRecordBase的Avro GenericRecordBase对象上执行Bijection,或者是否有更简单的方法将AvroSerializer类用作Kafka键和值串行器。

Injection<GenericRecord, byte[]> genericRecordInjection =
                                        GenericAvroCodecs.toBinary(schema);
byte[] bytes = genericRecordInjection.apply(type);

2 个答案:

答案 0 :(得分:1)

https://github.com/miguno/kafka-storm-starter提供了此类示例代码。

例如,请参阅AvroDecoderBolt。从它的javadocs:

  

此螺栓需要Avro编码的二进制格式的传入数据,根据T的Avro架构进行序列化。它会将传入的数据反序列化为T pojo,并将此pojo发送给下游消费者。因此,对于Avro数据,这个螺栓可以被认为是类似于Twitter Bijection的Injection.invert[T, Array[Byte]](bytes)

,其中

  

T:基于正在使用的基础Avro架构的Avro记录的类型(例如Tweet)。必须是Avro的SpecificRecordBase

的子类

代码的关键部分是(我将代码折叠到此代码段中):

// With T <: SpecificRecordBase

implicit val specificAvroBinaryInjection: Injection[T, Array[Byte]] =
SpecificAvroCodecs.toBinary[T]

val bytes: Array[Byte] = ...; // the Avro-encoded data
val decodeTry: Try[T] = Injection.invert(bytes)
decodeTry match {
  case Success(pojo) =>
    System.out.println("Binary data decoded into pojo: " + pojo)
  case Failure(e) => log.error("Could not decode binary data: " + Throwables.getStackTraceAsString(e))
}

答案 1 :(得分:0)

Schema.Parser parser = new Schema.Parser();
            Schema schema = parser.parse(new File("/Users/.../schema.avsc"));
            Injection<Command, byte[]> objectInjection = SpecificAvroCodecs.toBinary(schema);
            byte[] bytes = objectInjection.apply(c);