Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件的Writeobject在java中不起作用_Java_File_Design Patterns_Serialization_Snapshot - Fatal编程技术网

文件的Writeobject在java中不起作用

文件的Writeobject在java中不起作用,java,file,design-patterns,serialization,snapshot,Java,File,Design Patterns,Serialization,Snapshot,我想将一个对象(游戏模型)消毒到文件中,然后从该文件中反序列化该对象 我有一个UIFClass,它有一个获取返回字符串的文件名的方法。 对于序列化部分,我还有两个类:GameSerializerClass和GameDeserializerClass。它们都是Actionlistener的子类 以下是实施部分所需的内容: 从UIFClass通过JFileChooser获取用户选择的文件 在UIFClass中使用GameSerializerClass,UIFClass是actionlistener

我想将一个对象(游戏模型)消毒到文件中,然后从该文件中反序列化该对象

我有一个UIFClass,它有一个获取返回字符串的文件名的方法。 对于序列化部分,我还有两个类:GameSerializerClass和GameDeserializerClass。它们都是Actionlistener的子类

以下是实施部分所需的内容:

  • 从UIFClass通过JFileChooser获取用户选择的文件
  • 在UIFClass中使用GameSerializerClass,UIFClass是actionlistener 将GameModel对象序列化(保存)到用户指定的文件中
  • 使用GameDeserializerClass,它也是一个actionlistener 从用户指定的文件反序列化(readobject)
我已经创建了一个GameModel对象,并且在UIFClass中有一个引用。 通过UIFClass创建GameSerializerClass对象的方式,构造函数具有(GameModel)对象和UIFClass(this)。 它还创建了构造函数拥有UIFClass的GameDeserializerClass对象(此)

我有一个方法可以将JFileChooser的actionlistener设置为GameSerializerClass和GameDeserializerClass

在执行的操作中,我从字符串创建一个文件对象,然后将其传递给新的ObjectInputStream,然后将ObjectInputStream传递给writeObject(ObjectOutputStream out)。将该方法内部导出。writeObject(GameModel)

它没有写入文件,我不知道为什么

代码如下:

public class GameUserInterface {

    public GameSerializer gmserilizer;
    public GameDeserializer gmdeserilizer;
    public GameModel gmMdl;
    public JFileChooser jfc = new  JFileChooser();
    private String saveFileName;
    static JFileChooser fc;
    FileOutputStream fos ;
    FileInputStream fis ;

    public String getsaveFileName()
    {
        jfc.setFileSelectionMode(fc.FILES_ONLY);
        jfc.showOpenDialog(null);
        File myfile = jfc.getSelectedFile();
        saveFileName = myfile.getAbsolutePath();
        System.out.println("the file name is " + saveFileName); 
        return saveFileName; 
    }

void writeTofile()
    {
        getMilestoneMementoManager();

        try {

            jfc.addActionListener(new GameSerializer(this, this.gmMdl));
            fos = new FileOutputStream(getsaveFileName());
            } catch (IOException ex) {
}

    }
配子类

public class GameSerializer implements ActionListener {

    private GameUserInterface ui;
    private GameModel model;

    GameSerializer(GameUserInterface ui , GameModel model)
    {
        this.ui = ui;
        this.model = model;
    }

    private void writeObject(ObjectOutputStream obos) throws IOException
    {
        try {
obos.writeObject(model);
           System.out.println("I reached to that point " + model.toString() );
        } catch (IOException ex) {
            Logger.getLogger(GameSerializer.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {        
        try {
            System.out.println("I am at actionPerformed in GameSerializer class !");
            File myFile = new File(ui.getsaveFileName());
            ObjectOutputStream obos = new ObjectOutputStream(new FileOutputStream(myFile));
            writeObject(obos);
        } catch (IOException ex) {
            Logger.getLogger(GameDeserializer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

我附上了UML图。我正在尝试使用快照模式

你能帮帮我吗? 非常感谢。
Hind

为什么writetofile会打开一个输出流(似乎完全没有使用)?此外,在您的actionPerformed中,您应该在完成写入后关闭流。您好,jtahborn,我在writetofile中删除了输出流,我尝试在actionPerformed中关闭流,但它仍然没有写入文件,我还尝试在writeObject(ObjectOutputStream obos)中关闭流,但仍然没有写入文件。我还试图打印对象,它给了我指针,但它没有将其写入文件。顺便说一句,序列化为Java本机格式不一定是唯一的选择。您可以选择使用googlegson()之类的库序列化为JSON