Java 保存单例对象
我知道这个网站不是为这样的问题,但我一直在寻找答案,我没有找到任何东西,我需要一个确认 我有一个singleton类,它是我程序的中心,在某些情况下,我试图保存它的状态,但是它似乎没有正确保存,我不明白为什么,因为这不是我第一次这样做,但是这是我第一次尝试保存singleton,所以可以保存singleton对象吗? 这是我加载和保存此对象的代码Java 保存单例对象,java,serialization,object,singleton,save,Java,Serialization,Object,Singleton,Save,我知道这个网站不是为这样的问题,但我一直在寻找答案,我没有找到任何东西,我需要一个确认 我有一个singleton类,它是我程序的中心,在某些情况下,我试图保存它的状态,但是它似乎没有正确保存,我不明白为什么,因为这不是我第一次这样做,但是这是我第一次尝试保存singleton,所以可以保存singleton对象吗? 这是我加载和保存此对象的代码 public void Loading(String name) { ObjectInputStream is = null; //ign
public void Loading(String name) {
ObjectInputStream is = null;
//ignore this variable
game_loaded = 1;
try {
is = new ObjectInputStream(new FileInputStream(name + ".dat"));
//Logica is the singleton class,
//logi is the name of the variable where it is
logi = (Logica) is.readObject();
} catch (FileNotFoundException e1) {
JOptionPane.showOptionDialog(frame, "Game Invalid", "Load",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
null, new String[] { "Ok" }, "Ok");
return;
} catch (IOException e1) {
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
}
JOptionPane.showOptionDialog(frame, "Game Loaded Sucessfully", "Load",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
null, new String[] { "Ok" }, "Ok");
}
保存:
}
编辑
好吧,我可能已经正确解释了,它不会给我任何错误加载,但是它不会加载我保存的状态,它加载一个新的“Logica”,就像我创建了一个新的一样单例本身并没有说它不能序列化;您可以为任何类编写不正确的序列化代码。现在还不清楚出了什么问题,我也不愿意仔细研究您的代码来找出问题所在,但这应该是可能的
IOException有一个空的catch块。那总是个坏主意。你已经接受了可能解释一切的例外情况。打印堆栈跟踪。您描述的情况是不可能的。因此,你没有正确地描述它。你的观察结果可能有问题 我强烈怀疑IOException或FileNotFoundException,尽管您在另一个答案中有评论。您发布的代码至少在四个不同的位置忽略异常。这种假设是压倒性的 事实上,异常处理需要做很多工作。例如,如果出现异常,您不会关闭文件。没有最后一个街区。您有多个try/catch块,其中应该有一个try和多个catch
进一步的问题以及其他的询问。正在创建文件吗?长度非零?或者可能singleton类只有临时字段?您的代码有什么不正确的地方?一句忠告:去掉所有Swing代码。以这种方式混合UI代码会降低类的可用性。没有秋千你不能用它。您是否希望在web应用程序中使用此类?太糟糕了。你也应该看看。简短回答:使用
Enum
singleton。Matt Ball是正确的,但这不能解释为什么不能序列化对象。不,它没有说明任何问题。实际上没有实际的错误,程序a只是不加载状态,它加载一个新的空“Logica”,就像我现在创建了一个新的一样。
public void saving(String nome){
ObjectOutputStream os = null;
try {
os = new ObjectOutputStream(new FileOutputStream(nome+".dat"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
return;
} catch (IOException e) {
// TODO Auto-generated catch block
return;
}
try {
os.writeObject(Logica.getLogica(null));
} catch (IOException e) {
// TODO Auto-generated catch block
return;
}
JOptionPane.showOptionDialog(frame, "Game Saved sucessfully", "Load",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
null, new String[] { "Ok" }, "Ok");
if (os != null)
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}