#java #serialization
#java #сериализация
Вопрос:
У меня проблема при сохранении сериализации объекта и последующей его загрузке снова..
Сначала у меня есть класс с изначально следующей строкой «A», «B», «C», я сохранил его с некоторыми данными в файл…
Позже я модифицировал класс, чтобы в нем была еще одна строка «D». После того, как я загрузил файл, который я сохранил до внесения изменений, приложение не знает о новой строке «D»…
Каков наилучший механизм для решения такой проблемы… Копирование данных из старого объекта в новый займет очень много времени… Я хочу, чтобы сохраненный объект знал, что произошли некоторые изменения в структуре…
Пожалуйста, любая помощь…
Ответ №1:
Используйте другой serialVersionUID
, чтобы сообщить системе, что существует другая версия.
Среда выполнения сериализации связывает с каждым сериализуемым классом номер версии, называемый 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