gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:29:15 26 4
gpt4 key购买 nike

我创建了一个使用自定义序列化器和反序列化器的简单生产者-消费者应用程序。
在向我生成的 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,它应该只关心类的模式,对吗?

最佳答案

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

关于java - 卡夫卡消费者陷入反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66092729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com