Влияет ли изменение имени класса на десериализацию Java?

Делаю модификацию и отдельное приложение позволяющее сохранять реплеи для определенной игры.

Что мне нужно сериализовать и десериализовать, так это 2 массива класса ContO, массивы класса Plane, Trackers и класса Medium, и это не проблема.

Чтобы расширить этот функционал, я решил перестроить его в отдельное приложение, чтобы оно поддерживало 2 версии указанной игры. Я планирую сделать это с помощью абстрактных классов с именами Medium, ContO, Plane и Trackers, а классы, которые будут их расширять, будут называться вроде MediumVersion1 и MediumVersion2, ContOVersion1 и т. д.

В исходных игровых файлах класс называется ContO, Plane, Trackers и Medium для обеих версий, и мне интересно, изменив имя класса, чтобы отразить версию файла, который будет десериализован, повлияет ли это на процесс десериализации?

Например, я сериализую класс как имя ContO в исходных файлах игры, но десериализую его под новым именем класса ContOVersion1, но с точно такими же переменными.


person user2741371    schedule 24.05.2015    source источник
comment
Я так считаю. Что произошло, когда вы попробовали это?   -  person Elliott Frisch    schedule 25.05.2015
comment
Как вы предлагаете это сделать?   -  person Stephen C    schedule 25.05.2015


Ответы (2)


Я только что попробовал это, и ответ: вы не можете изменить имя класса. Вы получите ClassCastException, когда попытаетесь передать объект, который вы возвращаете из ObjectInputStream.readObject(), в ваш новый класс с другим именем. Это так, даже если вы сохраняете один и тот же serialVersionUID для обоих классов.

person bhspencer    schedule 24.05.2015
comment
Да, я также понял, что это невозможно сделать, когда увидел документацию Java для ObjectOutputStream.writeObject() - prntscr.com /7991g7, так как имя действительно записывается в процессе сериализации - person user2741371; 25.05.2015

Вы можете определенно не делать этого.

Исходные имена классов и пакетов кодируются вместе с данными, а входящий объект создается как этот класс, поэтому, чтобы избежать исключения приведения класса, то, к чему вы его приводите, должно быть идентичным, как и многие другие аспекты класса. Но не все из них. Дополнительную информацию см. в главе «Управление версиями объектов» Спецификации сериализации объектов.

person user207421    schedule 24.05.2015
comment
Ссылка для направления меня к Спецификации сериализации объектов? - person user2741371; 25.05.2015
comment
Спецификация сериализации объектов Java. 5 секунд в гугле. - person user207421; 26.05.2015