【问题标题】:Avro serialization exception - java.time.Instant cannot be cast to java.lang.LongAvro 序列化异常 - java.time.Instant 不能转换为 java.lang.Long
【发布时间】:2020-02-11 03:48:16
【问题描述】:

我想发送带有扩展类的有效负载的 Kafka 消息 SpecificRecordBase;它是一个借助 maven 插件生成的类。

我的模式的一个字段有一个类型的时间戳毫秒,它对应于生成的类中的 java.time.Instant。

字段定义如下:

{"name": "processingTime", "type": {
   "type": "long",
   "logicalType": "timestamp-millis"
   }
},

当我创建这个类的一个实例并设置处理时间时,

setProcessingTime(RandomDate.randomInstant())

一切正常,但是当我运行程序并尝试将其发送到 Kafka 时,我收到以下错误:

org.apache.kafka.common.errors.SerializationException: Can't convert value of class poc.avroGenerated.AvroMeasurement to class poc.avroSerde.AvroSerializer specified in value.serializer
Caused by: java.lang.ClassCastException: class java.time.Instant cannot be cast to class java.lang.Long (java.time.Instant and java.lang.Long are in module java.base of loader 'bootstrap')

这是我的自定义序列化程序类:

@Override
public byte[] serialize(String topic, T data) {

    byte[] result = null;
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        BinaryEncoder binaryEncoder = EncoderFactory.get().binaryEncoder(byteArrayOutputStream, null);
        DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(data.getSchema());
        datumWriter.write(data, binaryEncoder);
        binaryEncoder.flush();
        byteArrayOutputStream.close();
        result = byteArrayOutputStream.toByteArray();
    } catch (IOException e) {
        LOGGER.error(e);
    }
    return result;
}

【问题讨论】:

    标签: java serialization apache-kafka avro


    【解决方案1】:

    使用SpecificDatumWriter 代替GenericDatumWriter

    加入这一更改,您的自定义序列化程序看起来不错!

    这常常是一个令人困惑的地方。在 Java 实现中,“通用”数据不考虑构建到特定记录中的任何自定义,包括逻辑类型转换。

    【讨论】:

    • 有效!还有几个问题:它适用于 DatumWriter datumWriter = ... 和 DatumWriter datumWriter = ...。为什么会这样?隐式转换是否发生在某处?它是否会影响数据序列化的方式,从而影响以后的反序列化过程?
    • 它也应该适用于DatumWriter&lt;Object&gt;DatumWriter&lt;T&gt;!只要方法编译成功,最终都是相同的实现。 (DatumWriter 的模板类型在以任何方式编译后都会被删除——重要的是要更改实现类。)
    • “这经常是一个混淆点。在 Java 实现中,“通用”数据不考虑任何内置到特定记录中的自定义,包括逻辑类型转换。”:谢谢@RyanSkraba。这解释了很多事情......尤其是为什么我有很多ClassCastException......
    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 2016-07-26
    • 2013-08-24
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多