Java (readObject+;readresolve)读取为指针
我想使用Java (readObject+;readresolve)读取为指针,java,serialization,objectinputstream,Java,Serialization,Objectinputstream,我想使用ObjectInputStream从文件中读取对象。 下面是readObject方法的内部结构: public void readObject(ObjectInputStream inbos) throws IOException { try { GameModel gm = (GameModel) inbos.readObject(); } catch (IOException ex) { Logger.getLogger(GameDe
ObjectInputStream
从文件中读取对象。
下面是readObject
方法的内部结构:
public void readObject(ObjectInputStream inbos) throws IOException {
try {
GameModel gm = (GameModel) inbos.readObject();
} catch (IOException ex) {
Logger.getLogger(GameDeserializer.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(GameDeserializer.class.getName()).log(Level.SEVERE, null, ex);
}
}
我的GameModel
类有一个readResolve
方法<代码>游戏模型类也是一个单例
public Object readResolve() throws ObjectStreamException {
System.out.println("At read resolve method ");
GameModel themodel = getGameModel();
System.out.println("Reading the file : " + themodel.toString() + themodel );
return themodel;
}
问题是它没有正确读取对象。
它把它当作指针来读。
我需要帮助。您的实现将用当前的单例替换您在流中编写的内容,因此没有实际使用流中的数据。(假设getGameModel()
获取singleton实例)
说明:ObjectInputStream
将实例化并反序列化GameModel
的新实例,然后调用readResolve()
,如果您当前的实现是这样的,它将告诉流改用旧的单例
如果你正试图这样做,你也应该考虑写一个空来避免将不必要的数据写入流。 如果这不是你想要的,而且
GameModel
真的应该是单身,那么你的选择是:
readResolve()
readResolve()
替换当前单例实例(听起来很危险)GameModelReplacement
)保存要保存/还原的数据的任意数量的技巧李>
关于
readObject()
:您的问题中不清楚该readObject是否在GameModel
中。我想不是。但是,如果是,则语句(GameModel)inbos.readObject()代码>毫无意义,因为游戏模型是当前对象(此
)。如果是这种情况,请执行以下操作:
public class GameModel {
private void readObject(ObjectInputStream inbos) throws IOException {
// do nothing
}
private void writeObject(ObjectOuputStream out) throws IOException {
// do nothing
}
private Object readResolve() throws ObjectStreamException {
// discarding serialized gamemodel, and using the singleton.
return getGameModel();
}
}
你能澄清一下“将其作为指针读取”是什么意思吗?另外,readObject()是游戏模型的readObject吗?如果是,请将其移除。(快照模式。GameModel@506c0a14snapshotpattern.GameModel@506c0a14)这是我读取文件时得到的输出。@missh这只是出于某种原因对对象调用toString()两次的结果。这并不是“作为指针”的任何证据,在Java中这是毫无意义的。