我需要更改由ObjectMapper序列化/反序列化的类的属性。
这是我的课程。
// Old version
Class A {
String id;
String name;
}
// New version
Class A {
String id;
String firstName;
String secondName;
}
我序列化对象ObjectMapper.writeValueAsString()
,将其发送到队列中以供以后处理,然后在接收到该对象时,通过ObjectMapper.readValue()
将其反序列化。
如果将旧版本的Class A序列化,但是{@ 1}}的预期行为是什么?反序列化时-Class A已更新为新版本。
readValue()
和firstName
是否为空?还是secondName
抛出异常?
在这里,如何平滑地进行更改?
答案 0 :(得分:0)
要回答关于反序列化较旧对象的预期行为的第一部分,objectMapper.readValue()
将反序列化,其中firstName
和secondName
为null
,而{{1 }}是什么设置。 (我期待的是例外,情况并非如此)。
关于如何进行过渡:
我不会删除name
。我将与name
和firstName
保持一致。
secondName
// Intermediate version
Class A {
String id;
String name;
String firstName;
String secondName;
}
将是一个虚拟持有人,序列化时不使用。
name
基于null检查,我将知道该对象属于旧版本还是新版本。
public void write(int id, String firstName, String secondName) {
A a = new A();
a.setId(id);
a.setFirstName(firstName);
a.setSecondName(secondName);
bufferedWriter.write(objectMapper.writeValueAsString(a));
}
确定不会读取旧版本的对象后,我将通过删除public void read(String message) {
A a = objectMapper.readValue(message);
if(a.getName() != null) {
// This object is older version of class A
System.out.println("Name: " + a.getName());
metric.emit("OldObjectA", 1);
} else {
// This object is newer version of class A
System.out.println("Name: " + a.getFirstName() + " " + a.getSecondName())
}
}
进行完整的过渡。
name