我使用自定义序列化器和反序列化器创建了一个简单的生产者-消费者应用程序。
向我生成的 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,它应该只关心类的架构,对吗?
答案 0 :(得分:1)
如果您使用 JsonSerializer
,它不应受方法更改的影响 - 仅更改数据字段。其他序列化器可以序列化整个对象,包括方法。
答案 1 :(得分:0)
正如@Menelaos 所建议的,解决方案是使用 JsonSerializer。您可以在 here 中找到实现。