Чтобы ответить на первую часть относительно того, каково ожидаемое поведение, если десериализован более старый объект, objectMapper.readValue()
десериализуется с firstName
и secondName
, равными null
, тогда как name
будет тем, что было установлено. (Я ожидал исключения, которого нет).
О том, как сделать переход:
Я не буду удалять name
. Я буду держать его вместе с firstName
и 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));
}
На основе проверки на ноль я узнаю, принадлежит ли объект более старой или более новой версии.
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;
}