我正在寻找有关如何进行转换的相同信息。当前,转换始终为null,并且在使用逻辑类型时无法转换为BigDecimal。但是,我可以在自动生成的存根类中看到以下转换。但是反序列化器读取的对象类型始终是ByteBuffer,并引发Class Cast Exception。
在自动生成的存根文件中(为清晰起见而设置):
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()中的Conversion始终为NULL。
Conversion conversion = ((SpecificRecordBase)).getConversion(f.pos());
Avro版本现在为1.8.2,带有Confluent平台和注册表。
如何在解串器中设置转换?
答案 0 :(得分:0)
我需要更多的上下文来确切说明问题所在-除非您正在编写序列化程序,否则通常不会自己打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()...
上调用该代码