【问题标题】:(readObject + readresolve ) read as pointer(readObject + readresolve) 读取为指针
【发布时间】:2015-05-10 22:02:49
【问题描述】:

我想使用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;
}

问题是它没有正确读取对象。 它正在读取它作为指针。 我需要帮助。

【问题讨论】:

  • 您能否阐明“将其作为指针阅读”的意思?
  • 另外,readObject() 是 GameModel 的 readObject 吗?如果是这样,请将其删除。
  • (snapshotpattern.GameModel@506c0a14snapshotpattern.GameModel@506c0a14 ) 这是我读取文件时得到的输出。
  • @missh 这只是对对象调用 toString() 两次的结果,出于某种原因。它不是任何“作为指针”的证据,这在 Java 中是没有意义的。

标签: java serialization objectinputstream


【解决方案1】:

您对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();
    }
}

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2020-11-22
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多