[英]Jackson ObjectMapper readValue expected behavior when class properties change
我需要更改由ObjectMapper序列化/反序列化的类的属性。
这是我的课。
// Old version
Class A {
String id;
String name;
}
// New version
Class A {
String id;
String firstName;
String secondName;
}
我对对象ObjectMapper.writeValueAsString()
序列化,将其发送到队列中以供以后处理,然后在接收到该对象时,通过ObjectMapper.readValue()
将其反序列化。 如果将旧版本的A类序列化,但是反序列化时, readValue()
的预期行为是什么-A类已更新为新版本。
firstName
和secondName
为null? 还是readValue()
抛出异常?
怎样才能使更改顺利进行?
要回答关于反序列化较旧对象的预期行为的第一部分, objectMapper.readValue()
将反序列化,其中firstName
和secondName
为null
而name
则设置为null
。 (我期待的不是一个例外)。
关于如何进行过渡:
我不会删除name
。 我将其与firstName
和secondName
一起secondName
。
// Intermediate version
Class A {
String id;
String name;
String firstName;
String secondName;
}
name
将是一个虚拟持有人,序列化时不使用。
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));
}
基于null检查,我将知道该对象属于旧版本还是新版本。
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
进行完整的转换。
// Newer version
Class A {
String id;
String firstName;
String secondName;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.