【问题标题】:java.io.NotSerializableException: java.beans.EventHandlerjava.io.NotSerializableException: java.beans.EventHandler
【发布时间】:2015-08-09 02:33:06
【问题描述】:

我有这个异常,我不明白为什么会抛出它或者我应该如何处理它。

        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 对象保存为二进制文件。以前,我可以使用 XMLEncoder 类似地将相同的对象写入 XML。

 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 的documentation 中读到的所有内容及其示例都会让我相信这应该像XMLEncoder 那样工作。我会为你打印出我的堆栈,但这是一个 gui,我不知道如何在控制台中启用它。

【问题讨论】:

    标签: java binary objectoutputstream eventhandler notserializableexception


    【解决方案1】:

    根据您指出的documentation

    只有支持 java.io.Serializable 接口的对象才能被 写入流。

    根据Java Doc of java.bean.EventHandler,它没有实现Serializable

    【讨论】:

      【解决方案2】:

      我不知道您可能已经阅读了哪些内容会导致您对此有所期待。

      您链接到的非常 ObjectOutputStream Javadoc 明确指出

      只有支持java.io.Serializable 接口的对象才能写入流。

      它需要传递给它的对象以及通过非静态非瞬态引用从它可访问的所有对象来实现Serializable

      XMLEncoder 没有这个限制。

      【讨论】:

      • 嗯,我是阅读文档的新手。感谢您指出这一点。我一直在读它,但并没有清楚地理解我在读什么。
      • 我想我从来没有发现这个问题,因为我不知道哪些对象支持java.io.Serializable。是否有对象类型的列表是和不是?那将是非常有用的东西。感谢@EJP 和@Wand Maker 到目前为止的所有帮助。编辑:这似乎是列表docs.oracle.com/javase/8/docs/api/java/io/class-use/… ...它说支持 JFrame。
      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 2013-07-11
      • 2013-01-03
      • 2013-09-13
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多