Java (readObject+;readresolve)读取为指针

Java (readObject+;readresolve)读取为指针,java,serialization,objectinputstream,Java,Serialization,Objectinputstream,我想使用ObjectInputStream从文件中读取对象。 下面是readObject方法的内部结构: public void readObject(ObjectInputStream inbos) throws IOException { try { GameModel gm = (GameModel) inbos.readObject(); } catch (IOException ex) { Logger.getLogger(GameDe

我想使用
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
方法<代码>游戏模型类也是一个单例

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;
}
问题是它没有正确读取对象。 它把它当作指针来读。 我需要帮助。

您的实现将用当前的单例替换您在流中编写的内容,因此没有实际使用流中的数据。(假设
getGameModel()
获取singleton实例)

说明:
ObjectInputStream
将实例化并反序列化
GameModel
的新实例,然后调用
readResolve()
,如果您当前的实现是这样的,它将告诉流改用旧的单例

如果你正试图这样做,你也应该考虑写一个空来避免将不必要的数据写入流。 如果这不是你想要的,而且

GameModel
真的应该是单身,那么你的选择是:

  • 使用
    readResolve()
  • 使用
    readResolve()
    替换当前单例实例(听起来很危险)
  • 使用替换对象(如
    GameModelReplacement
    )保存要保存/还原的数据的任意数量的技巧
    关于
    readObject()
    :您的问题中不清楚该readObject是否在
    GameModel
    中。我想不是。但是,如果是,则语句
    (GameModel)inbos.readObject()毫无意义,因为游戏模型是当前对象(
    )。如果是这种情况,请执行以下操作:

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

    你能澄清一下“将其作为指针读取”是什么意思吗?另外,readObject()是游戏模型的readObject吗?如果是,请将其移除。(快照模式。GameModel@506c0a14snapshotpattern.GameModel@506c0a14)这是我读取文件时得到的输出。@missh这只是出于某种原因对对象调用toString()两次的结果。这并不是“作为指针”的任何证据,在Java中这是毫无意义的。