You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GenericAvroDeserializer反序列化含decimal逻辑类型的Avro字节失败如何解决

解决方案

可以正常反序列化,按以下步骤操作即可:

1. 修正反序列化器配置

你当前将value.deserializer配置为org.apache.kafka.common.serialization.BytesDeserializer属于冗余配置,不需要手动中转Bytes类型,直接配置对应Avro反序列化器即可:

  • 普通Kafka Consumer场景:value.deserializer配置为io.confluent.kafka.serializers.KafkaAvroDeserializer
  • Kafka Streams场景:直接使用io.confluent.kafka.streams.serdes.avro.GenericAvroSerde作为流的Value Serde

2. 开启逻辑类型自动转换

在配置中添加以下参数,开启Avro逻辑类型自动转换能力,反序列化器会自动将带decimal逻辑类型的bytes字段转换为java.math.BigDecimal类型,而非返回原始字节数组:

deserializer.avro.use.logical.type.converters=true

3. 手动转换兜底方案

如果你的业务流程必须保留先反序列化为Bytes、再手动调用GenericAvroDeserializer的逻辑,可以拿到原始字节数组后,用Avro自带的转换工具手动解码:

import org.apache.avro.Conversions;
import org.apache.avro.LogicalTypes.Decimal;

// 已拿到的原始字节数组
byte[] amountBytes = (byte[]) genericRecord.get("totalAmount");
// 对应字段的Avro Schema
Decimal decimalType = (Decimal) fieldSchema.getLogicalType();

BigDecimal totalAmount = new Conversions.DecimalConversion()
        .fromBytes(ByteBuffer.wrap(amountBytes), fieldSchema, decimalType);

内容的提问来源于stack exchange,提问作者Digital

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:06:04