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

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

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

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

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 Serializable, это объясняет механизм в деталях.

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам