Uploaded by Mr Vudi

Серилизация

advertisement
Serializable
1. В стандартной сериализации конструктор не вызывается, а выделяется память под объект
и из потока считываются данные
2. Static – переменные не сериализуются, тк принадлежат классу, а не объекту
3. При использовании Serializable они сериализуются и десериализуются как обычно, тк
переменные объявляются при вызове конструктора и изменить их уже нельзя
Externalizable
1. Обязательно наличие конструктора без параметров не ниже protected
2. При использовании Externalizable десериализовать final-переменную невозможно!
Пример 1. Если суперкласс сериализуем (implements Serializable), то по умолчанию
сериализуемым является каждый подкласс. Даже если подкласс не реализует сериализуемый
интерфейс, то мы можем сериализовать подкласс object. При сериализации не забываем явно
приводить к нужному типу. Пример 2. Если суперкласс не сериализуем, то подкласс все еще
может быть сериализован. - при сериализации исходные значения суперкласса будут
проигнорированы и записаны значения по умолчанию. - при десериализации каждый
несериализуемый суперкласс обязательно должен содержать конструктор по умолчанию (без
аргументов). В противном случае мы получим исключение во время выполнения. Пример 3. Если
суперкласс сериализуем, но мы не хотим, чтобы подкласс сериализовался. Прямого способа
предотвратить сериализацию подкласса в Java не существует. Одним из возможных способов, с
помощью которого программист может достичь этого, является реализация методов writeObject()
и readObject() в подклассе, и для этого необходимо вызвать исключение NotSerializableException
из этих методов. Эти методы выполняются во время сериализации и десериализации
соответственно. Переопределяя эти методы, мы просто реализуем нашу пользовательскую
сериализацию.
Метод writeObject с модификатором private, тогда и только тогда он вызовется, где ты сможешь
вручную настроить серилизацию, а если public, protected, или если вообще метод writeObject будет
отстутствовать, тогда серилизация будет автоматическая.
Download