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