Есть ли способ, которым я могу сохранить значение статической переменной во время Serializaion? - PullRequest
0 голосов
/ 31 августа 2011

В Java, как мы храним значение статической переменной во время сериализации?

Ответы [ 4 ]

2 голосов
/ 31 августа 2011

Так же, как и любое другое поле.

static String name;

// assign
name = "Bob";

// get
String n = name;

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

private static final String NAME_FILE = "name.txt";
static String name; static {
  try {
    name = FileUtils.readFileToString(NAME_FILE );
  } catch (IOException e) {
    name = "unknown";
}

public static String getName() { return name; }
public static void setName(String name) { 
   this.name = name;
   try {
      FileUtils.writeStringToFile(NAME_FILE, name);
   } catch(IOException e) {
      log.error(e);
   }
}

Вы можете сохранить переменную во время сериализации, переопределив wrireObject / readObject, однако это плохая идея. Вместо этого вам лучше сериализовать статическое значение.

1 голос
/ 31 августа 2011

Хороший ответ именно на этот вопрос :

"Самый простой вариант, который мне приходит в голову, - это использовать одноэлементные, а не статические поля. Одноэлементный объект можно сериализовать и десериализовать, и вы можете управлять его временем жизни, сохраняя при этом« глобальное состояние », которое дают статические поля. вы. "

1 голос
/ 31 августа 2011

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

(если это предположение верно), вы должны вручную сохранить это значение в некотором внешнем хранилище (как текстовый файл), а затем вы можете выполнить статическую инициализацию:

static String field;

static {
   field = readFromFile();
}

UPD : вам придется переопределить метод readObject, а также вам нужно будет ввести видстатической переменной флага.В методе readObject вы будете проверять флаг, и если он не установлен в значение `true '(т. Е. Если статические переменные еще не инициализированы), вы будете делать что-то похожее на фрагмент кода выше.

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

1 голос
/ 31 августа 2011

Вы не можете сериализовать статические переменные, но вы можете использовать только один экземпляр класса вместо статического. Посмотрите на шаблон singleton .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...