Как обрабатывать изменения класса при использовании сериализации и десериализации в Java - PullRequest
1 голос
/ 09 июля 2020

Я создаю небольшое приложение с использованием JavaFX, и у меня есть такая организация классов.

public class Context implements Serializable {
  private static final long serialVersionUID = 12355322553L;
  private A objA;
  private List<A> aList;
  ...
}

public class A implements Serializable {
  private static final long serialVersionUID = 467788765432L;
  private B objB,
  private List<B> bList;
  ...
}


для целей резервного копирования я использую сериализацию.

Мой вопрос: как обрабатывать десериализацию, когда вы изменили классы, например, добавив новое поле.

При добавлении нового поля следующим образом:

public class Context implements Serializable{
  private static final long serialVersionUID = 12355322553L;
  private A objA;
  private List<A> aList;
  private String name;
  ...
}

public class A implements Serializable{
  private static final long serialVersionUID = 467788765432L;
  private B objB,
  private List<B> bList;
  ...
}

при попытке десериализации моих старых данных с моей новой моделью I получена следующая ошибка


java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3016)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1575)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2343)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2267)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2125)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1624)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2343)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2267)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2125)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1624)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:464)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)

1 Ответ

0 голосов
/ 09 июля 2020

Первое, что вы должны помнить, это тот факт, что

private static final long serialVersionUID

не просто случайный декоратор для класса, а вместо этого используется виртуальной машиной для сериализации и десериализации объектов, с этим ID, виртуальная машина имеет ссылку на класс, участвующий в процессе, включая поля и даже методы, т.е. если вы каким-либо образом измените класс, добавив, удалив поля и / или методы, виртуальная машина больше не сможет десериализовать объекты. потому что считается совершенно другим классом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...