类属性更改时,Jackson ObjectMapper readValue的预期行为

时间:2018-11-06 15:45:15

标签: java json serialization jackson jackson2

我需要更改由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抛出异常?

在这里,如何平滑地进行更改?

1 个答案:

答案 0 :(得分:0)

要回答关于反序列化较旧对象的预期行为的第一部分,objectMapper.readValue()将反序列化,其中firstNamesecondNamenull,而{{1 }}是什么设置。 (我期待的是例外,情况并非如此)。

关于如何进行过渡:

我不会删除name。我将与namefirstName保持一致。

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