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