Кто на самом деле реализует сериализуемые методы?
Я учусь использовать Serializable
.
Я знаю, что если я создаю класс 'A' с различными переменными, который реализует 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 doc из
В принципе, вам не нужно ничего делать, если вы не хотите больше контролировать, как ваши объекты сериализуются, и в этом случае есть некоторые" волшебные " методы, которые вы можете реализовать и которые будут вызваны механизмом сериализации.Serializable
, он подробно объясняет механизм.Если вы хотите полный контроль, вы можете использовать Externalizable вместо этого.
Я знаю, что если я создаю класс 'A' с различными переменными, который реализует сериализуемый, и я добавляю сериализуемый к моему классу, он также сериализуем.
Да, в этот момент ваш класс сериализуем.
Чтобы класс был сериализуемым, каждый объект, содержащийся в качестве члена этого класса, также должен быть сериализуемым. Java будет запускать вниз дерево всех объектов, на которые ссылается ваш и сериализует их каждый по очереди.
Если вы хотите иметь больший контроль над тем, как сериализуются объекты, вы можете реализовать интерфейс Externalizable:
WriteExternal и readExternal методы externalizable интерфейс реализуется классом чтобы дать классу полный контроль над форматом и содержанием поток для объекта и его супертипы.
Если вы реализуете класс, который должен быть сериализуемым, вы также должны предоставить метод, который выполняет сериализацию в том же классе.
Вы не можете полагаться на объект, чтобы угадать, что ваш класс должен быть успешно сериализован и десериализован. Подумайте о рабочих переменных вашего класса, например, которые не нуждаются в сериализации, объект не сможет отличить их от важных полей.