Кто на самом деле реализует сериализуемые методы? - PullRequest
16 голосов
/ 09 июня 2009

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

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

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

Ответы [ 6 ]

15 голосов
/ 09 июня 2009

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

7 голосов
/ 09 июня 2009

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

3 голосов
/ 09 июня 2009

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

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

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

1 голос
/ 09 июня 2009

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

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

Запись Внешняя и Чтение Внешняя методы экстернализуемого интерфейс реализован классом дать классу полный контроль над форматом и содержанием поток для объекта и его супертипы.

1 голос
/ 09 июня 2009

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

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

0 голосов
/ 09 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...