Я работаю над сериализацией состояния сохранения с помощью нескольких статических методов и полей. Я мог бы поклясться, что эта сериализация и статический причиненный хаос. Должен ли я делать все статические переходные процессы? И будет ли раздувание вызовов восстанавливать статику как обычно?
Статические правила сериализации Java?
Ответ 1
static
неявно transient
, поэтому вам не нужно объявлять их как таковые.
Сериализация предназначена для сериализации экземпляров, а не классов. static
(методы неактуальны, поскольку они являются частью определения класса, поэтому они не сериализованы) будут повторно инициализированы до того значения, которое они устанавливают при загрузке класса.
Если у вас есть изменяемое поле static
, изменения, внесенные в это значение, будут потеряны.
Ответ 2
static
поля игнорируются для сериализации.
Обновлено, чтобы сказать static
, а не transient
, как я изначально планировал...
Ответ 3
Краткими правилами могут быть следующие:
1. static
переменная не сохраняется во время сериализации. И наоборот, во время процесса де-сериализации переменные static
начинаются с инициализации уровня класса.
2. static
и transient
переменные на основе ключевых слов игнорируются во время сериализации.
3. Имя класса и serialVersionUID
обе сериализуются как поток байтов, а при де-сериализации serialVersionUID
, считанный из источника, сравнивается с локальной переменной класса static
. Вот почему serialVersionUID
объявляется как static public final
, так что для сравнения этих версийUID не требуется создавать дополнительный объект.
- Если в случае обнаружения какой-либо разницы, InvalidClassException произойдет.
Ответ 4
static
поля не сериализованы.
Ответ 5
"Когда вы сериализуете экземпляр класса, единственными, которые сохраняются, являются данные нестатического и непереходного экземпляра. Определения классов не сохраняются. Они должны быть доступны, когда вы пытаетесь десериализовать объект" http://java.sun.com/developer/technicalArticles/ALT/serialization/