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

10-08 01:20