Avro序列化异常-无法将java.time.Instant强制转换为java.lang.Long

时间:2019-10-14 13:44:28

标签: java serialization apache-kafka avro

我想发送带有扩展 SpecificRecordBase 类的有效负载的Kafka消息;这是在maven插件的帮助下生成的类。

我架构的一个字段具有timestamp-millis类型,它对应于所生成类中的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;
}

1 个答案:

答案 0 :(得分:0)

使用SpecificDatumWriter代替GenericDatumWriter

放弃这一更改,您的自定义序列化程序就可以了!

这经常是一个混淆点。在Java实现中,“通用”数据不考虑内置到特定记录中的任何自定义项,包括逻辑类型转换。