Прочитал 4-5 статей про Serializable, основные детали понял, но есть тонкости, которые не могу освоить.
В задаче для сериализации и десериализации используются методы readObject() и writeObject(b). Для того чтобы записать переменную НЕсериализируемого класса родителя А, нужно "расширить" функционал сериализации, я так понял, и для этой цели, нужно создать два private метода writeObject(out) и readObject(in). Моменты которые я не понял:
1. Первый вызов метода идет out.defaultWriteObject/in.defaultReadObject(), а после идет запись переменной, класс которого no serializable. Объясните пожалуйста, каким образом все записывается правильно, если порядок записи неупорядоченный?
2. Если в задаче не используются два private метода writeObject(out) и readObject(in), как класс правильно все компилирует?
Расул
23 уровень
Решил, но некоторые нюансы не понял
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Андрей
21 июля 2021, 19:23решение
В этой задаче сериализуется класс В, при этом класс А не поддерживает сериализацию. Это значит, что при сериализации класса В все унаследованные поля класса А сериализоваться не будут. Но т.к. поле nameA объявлено как proteced и вроде как может использоваться в классе В имеет смысл его сериализовать. В итоге, out.defaultWriteObject/in.defaultReadObject() сериализует все из класса В (но не А, т.к. он не Serializable) и потом в read/writeObject насильно мы дописываем к сериализованным данным nameA.
Если бы не условия задачи, то можно было бы объявить класс А сериализуемым и вообще не писать методы read/writeObject, все бы работало автоматом.
+3
Расул
21 июля 2021, 19:54
Получается default сериализует все данные из класса, поддерживающие serializable, и к примеру если я в дальнейшем добавлю новые поля в класс, то дефолтный не изменится я правильно понимаю?
0
Андрей
21 июля 2021, 20:10решение
Если смотреть в контексте этой задачи, то если добавить поля в В, который объявлен как serializable, то да, ничего не изменится. Если добавить к А, то надо будет дописывать методы read/writeObject.
Внутри все работает достаточно просто, если класс не объявлен как сериализуемый, то выбрасывается эксепшн, при этом все механизмы для сериализцации работают монопиусально, берется поле, его значение и записывается в поток. Проверка на Serializable - это больше для подстраховки, что программист понимает то, что он делает. С большой долей вероятности, если бы проверки на сериализуемость (что реализован маркерный интерфейс) не было, то все бы в Java работало и так, но это не точно. Всегда есть нюансы.
+3