Правила статической сериализации Java? - PullRequest
33 голосов
/ 21 июня 2011

Я работаю над сериализацией состояния сохранения с несколькими статическими методами и полями.Я мог бы поклясться, что эта сериализация и статика вызвали хаос.Должен ли я сделать все статические переходные?И будет ли накачка звонков восстанавливать статику как обычно?

Ответы [ 6 ]

60 голосов
/ 21 июня 2011

static s неявно transient, поэтому вам не нужно объявлять их как таковые.

Сериализация предназначена для сериализации экземпляров , а не классов . static поля (методы не имеют значения, поскольку они являются частью определения класса, поэтому они не сериализуются) будут переинициализированы до любого значения, установленного при загрузке класса.

Если у вас есть изменяемое поле static, изменения, внесенные в это значение, будут потеряны.

4 голосов
/ 21 июля 2016

Краткие правила могут быть следующими:

1. Переменная static не сохраняется во время сериализации. И наоборот, в процессе десериализации переменные static инициируются из инициализации уровня класса.

2. Переменные на основе ключевых слов static и transient игнорируются во время сериализации.

3. Имя класса и serialVersionUID оба сериализуются как поток байтов, а при десериализации serialVersionUID, считываемый из источника, сравнивается с локальной переменной того же класса static. Вот почему serialVersionUID объявлен как static public final, так что больше нет необходимости создавать какой-либо объект для сравнения этих versionUID.

  • Если в случае обнаружения каких-либо различий, InvalidClassException будет происходить.
2 голосов
/ 21 июня 2011

static поля игнорируются для сериализации.

Обновлено, чтобы сказать static, а не transient, как я изначально предполагал ...

1 голос
/ 21 июня 2011

static поля не сериализованы.

0 голосов
/ 02 сентября 2018

Статические поля никогда не могут быть частью файла "ser". Статический + переходный процесс аналогичен переходному процессу.

0 голосов
/ 21 июня 2011

"Когда вы сериализуете экземпляр класса, единственные вещи, которые сохраняются, - это нестатические и непереходные данные экземпляра. Определения классов не сохраняются. Они должны быть доступны при попытке десериализации объекта" http://java.sun.com/developer/technicalArticles/ALT/serialization/

...