Кто на самом деле реализует сериализуемые методы?


Я учусь использовать Serializable.

Я знаю, что если я создаю класс 'A' с различными переменными, который реализует Serializable, и я добавляю Serializable к моему классу, это также Serializable.

Но кто на самом деле реализует эти два метода сериализации? Заботится ли Object обо всем или разные классы перегружают их, когда это необходимо?
6 16

6 ответов:

Сериализация фактически реализована в java.io.ObjectOutputStream (и java.io.ObjectInputStream) и некоторых его вспомогательных классах. Во многих случаях этой встроенной поддержки достаточно, и разработчику просто необходимо реализовать интерфейс маркера Serializable. Этот интерфейс называется "маркером", поскольку он не объявляет никаких методов и, следовательно, не требует специального API для классов реализации.

Программист может добавить или заменить механизм сериализации по умолчанию своими собственными методами, если это необходимо. Например, если после десериализации объекта требуется дополнительная инициализация, можно добавить метод со следующей сигнатурой:
private void readObject(java.io.ObjectInputStream s)
               throws java.io.IOException, java.lang.ClassNotFoundException

Для полного контроля над сериализацией и десериализацией, реализуйте java.io.Externalizable вместо Serializable.

Существует много других точек расширения в сериализации Java, если это необходимо. Спецификация сериализации является авторитетным и полным источником для изучения всех из них.

Я полагаю, что методы, о которых вы говорите, являются readObject() и writeObject(). Вы должны реализовать их только в том случае, если вам нужно выполнить пользовательскую сериализацию, например, когда у вас есть поля в объекте, которые не сериализуемы. Если у вас есть только сериализуемые поля и примитивы, вам не нужно реализовывать пользовательские методы сериализации. Кроме того, вы можете пропустить некоторые поля при сериализации, добавив к ним ключевое слово transient.

Посмотрите наAPI doc из Serializable, он подробно объясняет механизм.

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

Если вы хотите полный контроль, вы можете использовать Externalizable вместо этого.

Я знаю, что если я создаю класс 'A' с различными переменными, который реализует сериализуемый, и я добавляю сериализуемый к моему классу, он также сериализуем.

Да, в этот момент ваш класс сериализуем.

Чтобы класс был сериализуемым, каждый объект, содержащийся в качестве члена этого класса, также должен быть сериализуемым. Java будет запускать вниз дерево всех объектов, на которые ссылается ваш и сериализует их каждый по очереди.

Если вы хотите иметь больший контроль над тем, как сериализуются объекты, вы можете реализовать интерфейс Externalizable:

WriteExternal и readExternal методы externalizable интерфейс реализуется классом чтобы дать классу полный контроль над форматом и содержанием поток для объекта и его супертипы.

Если вы реализуете класс, который должен быть сериализуемым, вы также должны предоставить метод, который выполняет сериализацию в том же классе.

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