卡夫卡消费者陷入反序列化

时间:2021-02-07 20:22:41

标签: java apache-kafka

我使用自定义序列化器和反序列化器创建了一个简单的生产者-消费者应用程序。

向我生成的 Message 类添加新方法后,消费者开始在反序列化时堆叠。我的生产者正在使用新类(使用新方法),而消费者使用旧类(没有方法)。

我没有在发送的消息中添加任何新的数据成员!

我有多个类消息,它们都基于以下基类:

public enum MessageType{
    A,
    B,
    C,
}

public class Message implements Serializable {

    protected long id;
    protected MessageType type;

    public Message(int id , MessageType type) {
        this.id=id;
        this.type=type;
    }

每个消息类都添加了一些与该消息类型相关的数据成员。

例如:

public class MessageA extends Message{
    private String name;

    public MessageA(int id, String name) {
        super(id,MessageType.A);
        this.name = name;
    }

我的序列化器:

public class MessageSerializer implements Serializer<Message> {
    @Override
    public byte[] serialize(String topic, Message msg) {
        return SerializationUtils.serialize(msg);    
}

    @Override
    public void configure(Map<String, ?> configs, boolean isKey) {}

    @Override
    public void close() {}
}

我的解串器:

public class MessageDeserializer implements Deserializer<Message> {

    @Override
    public void configure(Map<String, ?> configs, boolean isKey) {}

    @Override
    public Message deserialize(String topic, byte[] data) {
        if(data == null)
            return null;
        log.info("Deserializing msg");
        Message msg= (Message) SerializationUtils.deserialize(data);
        if(msg== null){
            log.warn("Deserialization failed, got null as a result.");
            return null;
        }
        log.info("Deserialization complete");
        return msg;
    }

    @Override
    public void close() {}
    
    }

我向 MessageC 类添加了一个新方法,它是 Message 的子类。新的类版本仅适用于生产者,而不适用于消费者。虽然我没有改变类的模式,但这种改变会导致消费者反序列化出现问题吗?

在生成 MessageC 消息后,我的消费者打印了 "Deserializing msg",但由于它没有打印任何异常或 "Deserialization complete",它被卡住/失败。

JSONSerializer/Deserializer 可以处理这些类型的修复吗?如果我使用 JSONSerialzier,它应该只关心类的架构,对吗?

2 个答案:

答案 0 :(得分:1)

如果您使用 JsonSerializer,它不应受方法更改的影响 - 仅更改数据字段。其他序列化器可以序列化整个对象,包括方法。

答案 1 :(得分:0)

正如@Menelaos 所建议的,解决方案是使用 JsonSerializer。您可以在 here 中找到实现。