Для меня это был вопрос лицензирования для xcodebuild. После запуска bazel clean --expunge
я попытался снова запустить bazel, и у меня есть инструкция для запуска sudo xcodebuild -license
. Я выполнил, принял условия лицензии, снова запустил bazel clean --expunge
и все снова заработало. Надеюсь, это решит некоторые из случаев.
Сериализация фактически реализована в 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. Спецификация сериализации является авторитетным и полным источником для изучения всех из них.
Посмотрите документ API из Serializable
, в нем подробно объясняется механизм.
В принципе, вам не нужно делать что угодно, если вы не хотите большего контроля над сериализацией ваших объектов, и в этом случае вы можете реализовать некоторые «магические» методы, которые будут вызываться механизмом сериализации.
Если вы хотите полный контроль,вместо этого можно использовать Externalizable .
Я полагаю, вы говорите о методах readObject ()
и writeObject ()
. Вам нужно реализовать их только в том случае, если вам нужно выполнить настраиваемую сериализацию, например, когда у вас есть поля в вашем объекте, которые не сериализуемы. Если у вас есть только сериализуемые поля и примитивы, вам не нужно реализовывать собственные методы сериализации.
Кроме того, вы можете пропустить некоторые поля при сериализации, добавив к ним ключевое слово transient
.
Чтобы класс был сериализуемым, каждый объект, содержащийся как член этого класса, также должен быть сериализуемым. 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.
Я знаю, что если я создам класс «A» с разными переменными, который реализует Serializable, и добавлю Serializable к моему классу, он также будет Serializable.
Да, на данный момент ваш класс Serializable.
Если вы реализуете класс, который должен быть сериализуемым, вы также должны предоставить метод, который выполняет сериализацию в том же классе.
Вы не можете полагаться на Object, чтобы угадать, какой класс требуется для успешной сериализации и десериализации. Подумайте, например, о рабочих переменных вашего класса, которые не нужно сериализовать, Object не сможет отличить их от важных полей.