gpt4 book ai didi

java - (readObject + readresolve) 读取为指针

转载 作者:行者123 更新时间:2023-12-02 04:41:15 25 4
gpt4 key购买 nike

我想使用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 确实应该是一个单例,您的选择是:

  1. 使用 readResolve() 将数据从“刚刚读取的游戏模型”复制到单例
  2. 使用 readResolve() 替换当前的单例实例(听起来很危险)
  3. 任意数量的技巧 writeReplace/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();
}
}

关于java - (readObject + readresolve) 读取为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com