我想使用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;
}
问题是它没有正确读取对象。
它正在读取它作为指针。
我需要帮助。
最佳答案
readResolve()
的实现将用当前单例替换您在流中编写的所有内容,因此实际上不使用该流中的任何数据。 (假设getGameModel()
获取单例实例)
解释:ObjectInputStream
将实例化并反序列化GameModel
的新实例,然后调用readResolve()
,如果您当前的实现将告诉流使用旧的单例,则调用writeObject()
。
如果这是您要尝试的操作,则还应考虑编写一个空的GameModel
以避免将不必要的数据写入流。
如果这不是您的初衷,并且readResolve()
实际上应该是单例,则您的选择是:
使用readResolve()
将数据从“刚刚阅读的游戏模型”复制到单例
使用GameModelReplacement
替换当前的单例实例(听起来很危险)
writeReplace / readResolve使用替换对象(例如readObject()
)来保存要保存/恢复的数据的任何技巧;
关于GameModel
:您的问题尚不清楚该readObject是否在(GameModel) inbos.readObject();
中。我以为不是。但是,如果是,则语句this
没有意义,因为GameModel是当前对象()。如果是这种情况,请执行以下操作:
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();
}
}