Serialization Avro特定记录类型与通用记录类型-哪种类型最好,或者我可以在两者之间转换?

Serialization Avro特定记录类型与通用记录类型-哪种类型最好,或者我可以在两者之间转换?,serialization,avro,Serialization,Avro,我们正试图在为客户提供通用和特定的记录格式之间做出选择 为了提供在线模式注册表,客户机可以在模式更新时访问。 我们希望发送带有几个字节前缀的序列化blob,这些字节表示模式的版本号 从我们的注册表检索可以自动化 现在,我们遇到了一些代码示例,说明了 模式发生了变化,但我们不愿意放弃特定应用程序提供的类型安全性和易用性 格式 有没有一种方法可以使这两个世界都达到最好?也就是说,我们是否可以使用和操纵生成的特定 类,然后让它们在序列化之前自动转换为泛型记录? 然后,客户机将反序列化通用记录(在查找模

我们正试图在为客户提供通用和特定的记录格式之间做出选择 为了提供在线模式注册表,客户机可以在模式更新时访问。 我们希望发送带有几个字节前缀的序列化blob,这些字节表示模式的版本号 从我们的注册表检索可以自动化

现在,我们遇到了一些代码示例,说明了 模式发生了变化,但我们不愿意放弃特定应用程序提供的类型安全性和易用性 格式

有没有一种方法可以使这两个世界都达到最好?也就是说,我们是否可以使用和操纵生成的特定 类,然后让它们在序列化之前自动转换为泛型记录?
然后,客户机将反序列化通用记录(在查找模式之后)

此外,客户能否在以后将收到的这些通用记录转换为特定记录?一些小的代码示例会很有帮助


还是我们看得不对?

您正在寻找的是融合的模式注册服务和libs,这有助于与之集成

提供一个示例,用一个不断发展的模式编写序列化反序列化avro数据。请注意提供卡夫卡的样品

import io.confluent.kafka.serializers.KafkaAvroDeserializer;
导入io.confluent.kafka.Serializer.KafkaAvroSerializer;
导入org.apache.avro.generic.GenericRecord;
导入org.apache.commons.codec.DecoderException;
导入org.apache.commons.codec.binary.Hex;
导入java.util.HashMap;导入java.util.Map;
公共类ConfluentSchemaService{
公共静态最终字符串TOPIC=“DUMMYTOPIC”;
私人卡夫卡夫罗塞利泽;
私人卡夫卡夫罗德塞利泽;
公共ConfluentSchemaService(字符串ConfluentSchemaRegistryUrl){
//属性映射
Map propMap=newhashmap();
put(“schema.registry.url”,ConfluentSchemaRegistryUrl);
//反序列化后的输出应为特定记录,而不是一般记录
propMap.put(“specific.avro.reader”、“true”);
avroSerializer=新的KafkaAvroSerializer();
avroSerializer.configure(propMap,true);
avroDeserializer=新的KafkaAvroDeserializer();
配置(propMap,true);
}
公共字符串hexBytesToString(字节[]inputBytes){
返回Hex.encodeHexString(inputBytes);
}
公共字节[]hexStringToBytes(字符串hexEncodedString)引发DecodeXception{
返回Hex.decodeHex(hexEncodedString.ToCharray());
}
公共字节[]序列化AVROPOJOTOBytes(GenericRecord avroRecord){
返回avroSerializer.serialize(主题,avroRecord);
}
公共对象反序列化字节流AVROPOJO(字节[]avroBytearray){
返回avroDeserializer.deserialize(主题,avroBytearray);
} }
下面的类包含您要查找的所有代码。 io.confluent.kafka.serializers.Kafkavrodeserializer
io.confluent.kafka.serializers.KafkaAvroSerializer

有关更多详细信息,请访问链接:


我可以在它们之间转换吗?

我编写了以下kotlin代码,通过JSON将
SpecificRecord
转换为
GenericRecord
并返回

PositionReport
是使用gradle的avro插件从avro生成的对象-它是:


@org.apache.avro.specific.AvroGenerated
公共类PositionReport扩展org.apache.avro.specific.SpecificRecordBase实现org.apache.avro.specific.SpecificRecord{
...
使用的功能如下所示


/**
*用与AVRO兼容的JSON编码记录,表示联合类型
*对于更漂亮的JSON,只需使用对象映射器
*@param PositionReport
*@返回字符串
*/
private fun PositionReport.toAvroJson():字符串{
val writer=SpecificDatumWriter(位置报告::class.java)
val baos=ByteArrayOutputStream()
val jsonEncoder=EncoderFactory.get().jsonEncoder(this.schema,baos)
writer.write(这个,jsonEncoder)
jsonEncoder.flush()
返回宝钢toString(“UTF-8”)
}
/**
*从Genreic记录转换为JSON-看起来更聪明,
*为了统一这个函数和上面的函数,但是
*@param记录genericord
*@param模式
*/
private fun genericord.toAvroJson():字符串{
val writer=GenericDatumWriter(this.schema)
val baos=ByteArrayOutputStream()
val jsonEncoder=EncoderFactory.get().jsonEncoder(this.schema,baos)
writer.write(这个,jsonEncoder)
jsonEncoder.flush()
返回宝钢toString(“UTF-8”)
}
/**
*获取职位报告的一般记录,并
*它会变成一份职位报告…也许它会起作用
*@param gen genericord
*@返回位置报告
*/
私人娱乐场所(一般记录):场所报告{
if(gen.schema!=PositionReport.getClassSchema()){
抛出异常(“由于架构不匹配,无法将GenericRecord转换为PositionReport”)
}
//我们将转换成JSON,然后使用它转换回SpecificRecord
//也许有更好的办法
val json=gen.toAvroJson()
val reader:DatumReader=SpecificDatumReader(PositionReport::class.java)
val decoder:decoder=DecoderFactory.get().jsonDecoder(PositionReport.getClassSchema(),json)
val pos=读卡器读取(空,解码器)
返回位置
}
/**
*将特定记录转换为通用记录(我认为)
*@param PositionReport
*@return GenericData.Record
*/
私人娱乐公司(位置:Positio)