Проблемы с сериализацией объектов

#java #serialization

#java #сериализация

Вопрос:

У меня проблема при сохранении сериализации объекта и последующей его загрузке снова..

Сначала у меня есть класс с изначально следующей строкой «A», «B», «C», я сохранил его с некоторыми данными в файл…

Позже я модифицировал класс, чтобы в нем была еще одна строка «D». После того, как я загрузил файл, который я сохранил до внесения изменений, приложение не знает о новой строке «D»…

Каков наилучший механизм для решения такой проблемы… Копирование данных из старого объекта в новый займет очень много времени… Я хочу, чтобы сохраненный объект знал, что произошли некоторые изменения в структуре…

Пожалуйста, любая помощь…

Ответ №1:

Используйте другой serialVersionUID , чтобы сообщить системе, что существует другая версия.

Из JavaDoc о Serializable:

Среда выполнения сериализации связывает с каждым сериализуемым классом номер версии, называемый serialVersionUID, который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, совместимые в отношении сериализации. Если получатель загрузил класс для объекта, который имеет serialVersionUID, отличный от serialVersionUID соответствующего класса отправителя, то десериализация приведет к исключению InvalidClassException.Сериализуемый класс может явно объявить свой собственный serialVersionUID, объявив поле с именем «serialVersionUID», которое должно быть статическим, окончательным и иметь тип long:

ANY-ACCESS-MODIFIER статический конечный длинный serialVersionUID = 42L;

(Разметка мной)

Редактировать:

В качестве альтернативы вы могли бы просто использовать другое поле для сохранения версии и десериализации, несмотря на изменения класса. В этом случае новая строка должна быть инициализирована значением null. Затем вы могли бы проверить версию, чтобы увидеть, присутствовала ли строка в предыдущей версии и была ли она просто нулевой при сохранении или между ними произошло структурное изменение.

Пример:

 class MyObject {
   private static final versionUid = 1;
   private final int version;

   private String a, b, c, d; //plus getters/setters;

   public MyObject() {
     version = versionUid ; //needed if you want to load objects of different backward compatible versions and still know the version after deserialization
   }

   public int getVersion() {
     return version;
   }
}


MyObject readObjectOfVersion2 = ... ;//deserialize an object of version 1
if( readObjectOfVersion2.getVersion() > 1 ) {//assuming version 1 only has a,b,c and version 2  has d as well    
  String d = readObjectOfVersion2.getD();
}
  

Комментарии:

1. Извините, я только что узнал о сериализации.. Не могли бы вы выразиться более конкретно? Можете ли вы привести мне какой-нибудь пример кода? Итак, я все еще могу загрузить свой старый файл.. Потому что я получаю эту ошибку, когда пытаюсь загрузить свой старый файл, используя новую структуру -> java.io.InvalidClassException: com.joymaster.hypereditor.data. TreeScriptContent; несовместимость локального класса: stream classdesc serialVersionUID = -3425667071755815337, serialVersionUID локального класса = -916187445672973996