Serialization 双射-Java Avro序列化

Serialization 双射-Java Avro序列化,serialization,apache-kafka,avro,bijection,Serialization,Apache Kafka,Avro,Bijection,我正在寻找一个例子,在AvroSpecificRecordBase对象上执行类似于GenericRecordBase的双射,或者是否有更简单的方法将AvroSerializer类用作Kafka键和值序列化器 Injection<GenericRecord, byte[]> genericRecordInjection = GenericAvroCodecs.toBinary(schema); byte[]

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

Injection<GenericRecord, byte[]> genericRecordInjection =
                                        GenericAvroCodecs.toBinary(schema);
byte[] bytes = genericRecordInjection.apply(type);
注射通用协调注射=
通俗易懂(图式);
byte[]bytes=genericordinction.apply(类型);
提供了这样的示例代码

例如,请参见。从其javadocs:

此螺栓期望以Avro编码的二进制格式输入数据,并根据
T
的Avro模式进行序列化。它将把传入数据反序列化为
T
pojo,并将此pojo发送给下游消费者。因此,这个螺栓可以被认为是Twitter双射的风暴等价物
Injection.invert[T,Array[Byte]](bytes)
,用于Avro数据

在哪里

T
:基于所使用的底层Avro模式的Avro记录类型(例如
Tweet
)。必须是Avro的
SpecificRecordBase
的子类

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

//带T
System.out.println(“解码为pojo:+pojo的二进制数据”)
案例失败(e)=>log.error(“无法解码二进制数据:”+Throwables.GetStackTraceAString(e))
}
Schema.Parser Parser=新Schema.Parser();
Schema Schema=parser.parse(新文件(“/Users/../Schema.avsc”);
注射对象注射=特异性AVROCODECS.toBinary(模式);
byte[]bytes=objectInjection.apply(c);

我是否正确地假设模式仍然是对象本身的一部分?因为(通用)记录上有一个可用的方法.getSchema()。在我看来,这似乎违背了拥有一个单独模式的全部目的
// 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))
}
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);