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

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

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

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

Ответы

Ответ 1

Сериализация фактически реализована в 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 существует много других точек расширения. спецификация сериализации является авторитетным и полным источником для изучения всех них.

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Да, в этот момент ваш класс Serializable.

Ответ 5

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

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

Взаимодействие writeExternal и readExternal методы Externalizable интерфейс реализуется классом дать полный контроль над классом над форматом и содержанием поток для объекта и его супертипы.

Ответ 6

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

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