(readObject + readresolve)读为指针

时间:2015-05-10 22:02:50

标签: java serialization objectinputstream

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

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

1 个答案:

答案 0 :(得分:2)

readResolve()的实现将使用当前单例取代您在流中编写的任何内容,因此实际上不会使用流中的数据。 (假设getGameModel()获取单例实例)

解释:ObjectInputStream将实例化和反序列化GameModel的新实例,然后调用readResolve(),如果您当前的实现将告诉流使用旧的单例。< / p>

如果这是您要做的事情,您还应该考虑写一个空的writeObject()以避免将不必要的数据写入流中。

如果那不是你的想法,GameModel真的应该是一个单身人士,你的选择是:

  1. 使用readResolve()复制来自&#34;刚阅读游戏模型的数据&#34;到单身人士
  2. 使用readResolve()替换当前的单例实例(听起来很危险)
  3. writeReplace / readResolve使用替换对象(如GameModelReplacement)保存您要保存/恢复的数据的任意数量的技巧;
  4. 关于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();
        }
    }