繁体   English   中英

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

[英]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类已更新为新版本。

firstNamesecondName为null? 还是readValue()抛出异常?

怎样才能使更改顺利进行?

要回答关于反序列化较旧对象的预期行为的第一部分, objectMapper.readValue()将反序列化,其中firstNamesecondNamenullname则设置为null (我期待的不是一个例外)。

关于如何进行过渡:

我不会删除name 我将其与firstNamesecondName一起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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM