1

У меня есть это исключение. Я не понимаю, почему это было бы выброшено или как я должен его обработать.java.io.NotSerializableException: java.beans.EventHandler

 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 аналогично с 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, но не в формате двоичного файла. Все, что я прочитал из documentation объекта ObjectOutputStream, и это приводит к тому, что я должен полагать, что это должно работать как XMLEncoder. Я бы распечатал свой стек для вас, но это был gui, я не знаю, как включить его в консоли.

ответ

0

Согласно documentation указываемой вами,

только объекты, которые поддерживают интерфейс java.io.Serializable могут быть записаны в потоков.

и согласно Java Doc of java.bean.EventHandler, он не реализует Serializable

0

Я не знаю, что вы, возможно, читали, что приведет вас ожидать, что.

Очень ObjectOutputStream Javadoc вы связаны конкретно говорится

Только объекты, которые поддерживают интерфейс java.io.Serializable могут быть записаны потоки.

Для этого требуется переданный ему объект и все объекты, доступные из него через нестатические непереходные ссылки для реализации Serializable.

XMLEncoder не имеет этого ограничения.

+0

Ну, я новичок в чтении документации. Спасибо, что указали это. Я все время читал и не понимал, что я читаю, ясно. –

+0

Думаю, я никогда этого не понимал, потому что не знаю, какие объекты поддерживают 'java.io.Serializable'. Есть ли список типов объектов, которые есть и нет? Это то, что было бы очень полезно. Thankyou @EJP & @Wand Maker за всю вашу помощь. EDIT: Кажется, это список http://docs.oracle.com/javase/8/docs/api/java/io/class-use/Serializable.html ... он говорит, что поддерживается JFrame. –

Смежные вопросы