1

この例外があり、なぜスローされるのか、またはどのように処理すればよいのかわかりません。

        try{
            File file = chooser.getSelectedFile();
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(frame);
            oos.writeObject(list);
            oos.close();
        }catch (IOException e){
            JOptionPane.showMessageDialog(null, e);
        }

読み取り時に例外がスローされていると思いoos.writeObject(frame)ます。ここでは、JFrame オブジェクトをバイナリに保存しようとしています。以前は、この同じオブジェクトを .xml と同様に XML に書き込むことができましたXMLEncoder

 import java.awt.*;
 import java.awt.event.*;
 import java.beans.*;
 import java.io.*;
 import java.util.ArrayList;

 import javax.swing.*;


 @SuppressWarnings("serial")
 public class SaveFrame implements Serializable{
public static JFileChooser chooser;
public JFrame frame;
public JTextArea textArea;
public ArrayList<String> list = new ArrayList<String>();
public static void main(String[] args){
    chooser = new JFileChooser();
    chooser.setCurrentDirectory(new File("."));      
    SaveFrame test = new SaveFrame();
    test.initialize();
}

public void initialize(){

    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 300);
    frame.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

    JButton loadXML = new JButton("LoadXML");
    frame.getContentPane().add(loadXML);
    loadXML.addActionListener(EventHandler.create(ActionListener.class, this, "loadXML"));

    JButton saveXML = new JButton("SaveXML");
    frame.getContentPane().add(saveXML);
    saveXML.addActionListener(EventHandler.create(ActionListener.class, this, "saveXML"));

    JButton loadBinary = new JButton("LoadBinary");
    frame.getContentPane().add(loadBinary);
    loadBinary.addActionListener(EventHandler.create(ActionListener.class, this, "loadBinary"));

    JButton saveBinary = new JButton("SaveBinary");
    frame.getContentPane().add(saveBinary);
    saveBinary.addActionListener(EventHandler.create(ActionListener.class, this, "saveBinary"));

    JButton storeData = new JButton("StoreData");
    frame.getContentPane().add(storeData);
    storeData.addActionListener(EventHandler.create(ActionListener.class, this, "storeData"));

    JButton printData = new JButton("PrintData");
    frame.getContentPane().add(printData);

    textArea = new JTextArea(30,30);
    frame.getContentPane().add(textArea);
    printData.addActionListener(EventHandler.create(ActionListener.class, this, "printData"));


    frame.setVisible(true);
}

public void loadXML(){
    int r = chooser.showOpenDialog(null);

    if(r == JFileChooser.APPROVE_OPTION){
        try{
            File file = chooser.getSelectedFile();
            XMLDecoder decoder = new XMLDecoder(new FileInputStream(file));
            decoder.readObject();
            decoder.close();
        }
        catch (IOException e){
            JOptionPane.showMessageDialog(null, e);
        }
    }
}

public void saveXML(){
    if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION){
        try{
            File file = chooser.getSelectedFile();
            XMLEncoder encoder = new XMLEncoder(new FileOutputStream(file));
            encoder.writeObject(frame);
            encoder.writeObject(list);
            encoder.close();
        }
        catch (IOException e){
            JOptionPane.showMessageDialog(null, e);
        }
    }
}
public void storeData(){
    list.add(textArea.getText());
}
public void printData(){
    for(String s : list){
        textArea.append(s + " ");
    }
}
public void loadBinary() throws ClassNotFoundException{
    int r = chooser.showOpenDialog(null);

    if(r == JFileChooser.APPROVE_OPTION){
        try{
            File file = chooser.getSelectedFile();
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            ois.readObject();
            ois.close();
        }
        catch (IOException e){
            JOptionPane.showMessageDialog(null, e);
        }
    }
}
public void saveBinary(){
    if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION){
        try{
            File file = chooser.getSelectedFile();
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(frame);
            oos.writeObject(list);
            oos.close();
        }
        catch (IOException e){
            JOptionPane.showMessageDialog(null, e);
             }
          }
      } 
 }

XML に保存しているのに、バイナリ ファイル形式に保存していない場合に、なぜ機能するのかよくわかりません。ObjectOutputStream のドキュメントとその例から読んだことはすべて、これがXMLEncoderと同じように機能するはずだと私に信じさせるでしょう。スタックを出力しますが、これは GUI であるため、コンソールで有効にする方法がわかりません。

4

2 に答える 2

0

あなたが指摘したドキュメントによると、

ストリームに書き込むことができるのは、java.io.Serializable インターフェイスをサポートするオブジェクトだけです。

java.bean.EventHandler のJava Docによると、実装されていませんSerializable

于 2015-08-09T03:01:12.240 に答える
0

あなたが何を読んでいて、それを期待するようになったのか、私にはわかりません。

あなたがリンクしたまさにObjectOutputStreamJavadocは具体的に述べています

インターフェイスをサポートするオブジェクトのみjava.io.Serializableがストリームに書き込むことができます。

渡されたオブジェクトと、非静的で非一時的な参照を介してそこから到達可能なすべてのオブジェクトを実装する必要がありますSerializable

にはそのXMLEncoder制約はありません。

于 2015-08-09T03:02:18.317 に答える