有没有办法在Serializaion期间存储静态变量的值?

时间:2011-08-31 15:30:00

标签: java serialization static

在Java中,我们如何在序列化期间存储静态变量的值?

4 个答案:

答案 0 :(得分:2)

与任何其他领域相同。

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 :(得分:1)

您无法序列化静态变量,但只能使用一个类实例而不是静态变量。看看singleton模式。

答案 2 :(得分:1)

我想,问题更多的是在应用程序启动和关闭之间存储静态字段的值。

(如果这个假设是正确的话)你必须手动将值存储到某个外部存储器(如文本文件),然后你可以执行静态初始化:

static String field;

static {
   field = readFromFile();
}

UPD :你必须覆盖readObject方法,你还必须引入一种静态标志变量。在readObject方法中,你将检查标志,如果它没有设置为“true”(即如果静态变量尚未初始化),你将在上面的代码片段中执行某些操作。

我还假设如果你有多个线程,可能需要进行一些同步。

答案 3 :(得分:1)

确切地说明这个question的好答案:

“我想到的最简单的选择是使用单例而不是静态字段。单例对象可以被序列化和反序列化,你可以管理它的生命周期,同时保留静态字段给出的'全局状态'你“。