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

Для меня это был вопрос лицензирования для xcodebuild. После запуска bazel clean --expunge я попытался снова запустить bazel, и у меня есть инструкция для запуска sudo xcodebuild -license. Я выполнил, принял условия лицензии, снова запустил bazel clean --expunge и все снова заработало. Надеюсь, это решит некоторые из случаев.

16
задан GEOCHET 9 June 2009 в 15:52
поделиться

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

15
ответ дан 30 November 2019 в 21:29
поделиться

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

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

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

3
ответ дан 30 November 2019 в 21:29
поделиться

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

7
ответ дан 30 November 2019 в 21:29
поделиться

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

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

writeExternal и readExternal methods of the Externalizable interface are implemented by a class to give the class complete control over the format and contents of the stream for an object and its supertypes.

1
ответ дан 30 November 2019 в 21:29
поделиться

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

Да, на данный момент ваш класс Serializable.

1
ответ дан 30 November 2019 в 21:29
поделиться

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

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

-1
ответ дан 30 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: