如何在avro反序列化程序中钩住逻辑类型的转换?

q3qa4bjr  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(404)

我正在寻找关于如何钩住转换相同的信息。当前转换总是空的,当使用逻辑类型时,我无法转换为bigdecimal。但是,我可以在自动生成的存根类中看到以下转换。但是反序列化程序读取的对象类型总是bytebuffer,并且它抛出类强制转换异常。
在自动生成的存根文件中(格式清晰):

import org.apache.avro.data.Conversions
import org.apache.avro.data.TimeConversions
protected static final TimeConversions.DateConversion DATE_CONVERSION = new TimeConversions.DateConversion(); 
protected static final TimeConversions.TimeConversion TIME_CONVERSION = new TimeConversions.TimeConversion(); 
protected static final TimeConversions.TimestampConversion TIMESTAMP_CONVERSION = new TimeConversions.TimestampConversion(); 
protected static final Conversions.DecimalConversion DECIMAL_CONVERSION = new Conversions.DecimalConversion();

并且,specificdatumreader readfield()中的转换始终为null。 Conversion conversion = ((SpecificRecordBase)).getConversion(f.pos()); avro版本现在是1.8.2,具有融合平台和注册表。
如何在反序列化程序中设置转换?

col17t5w

col17t5w1#

我需要更多的背景来说明你的问题是什么-你一般不会打电话给我 getConversion() 除非你在写连续剧。
字段->转换器的查找在实际生成的类中;看看这个: private static final org.apache.avro.Conversion<?>[] conversions 这个转换表似乎只适用于序列化。反序列化时,需要注册转换。我不知道为什么会这样,但是您应该能够通过在启动时添加以下代码来解决这个问题,这些代码应该可以注册您需要的转换。

SpecificData.get().addLogicalTypeConversion(new Conversions.DecimalConversion());
SpecificData.get().addLogicalTypeConversion(new TimeConversions.DateConversion());
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimeConversion());
SpecificData.get().addLogicalTypeConversion(new TimeConversions.TimestampConversion());

根据具体的代码路径,您可能还需要在上调用该代码 GenericData.get()...

相关问题