在Java中,我们如何在序列化期间存储静态变量的值?
答案 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的好答案:
“我想到的最简单的选择是使用单例而不是静态字段。单例对象可以被序列化和反序列化,你可以管理它的生命周期,同时保留静态字段给出的'全局状态'你“。