我想使用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
个方法。 GameModel
类也是单身人士。
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;
}
问题是它没有正确读取对象。 它正在将其作为指针读取。 我需要帮助。
答案 0 :(得分:2)
readResolve()
的实现将使用当前单例取代您在流中编写的任何内容,因此实际上不会使用流中的数据。 (假设getGameModel()
获取单例实例)
解释:ObjectInputStream
将实例化和反序列化GameModel
的新实例,然后调用readResolve()
,如果您当前的实现将告诉流使用旧的单例。< / p>
如果这是您要做的事情,您还应该考虑写一个空的writeObject()
以避免将不必要的数据写入流中。
如果那不是你的想法,GameModel
真的应该是一个单身人士,你的选择是:
readResolve()
复制来自&#34;刚阅读游戏模型的数据&#34;到单身人士readResolve()
替换当前的单例实例(听起来很危险)GameModelReplacement
)保存您要保存/恢复的数据的任意数量的技巧; 关于readObject()
:如果readObject位于GameModel
,您的问题就不清楚了。我假设它没有。但是如果是,则语句(GameModel) inbos.readObject();
没有意义,因为GameModel是当前对象(this
)。如果是这样的话,可以这样做:
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();
}
}