java.io.NotSerializableException от объекта ObjectOutputStream.write

У меня есть объект, который я хочу записать в файл:

class PersonDaten implements Serializable {
    private static final long serialVersionUID = 1L;

    String firstname = "";
    Sting lastname = "";    
}

class InputOutput {
    public static <T> void output(T daten, String datei){
        try {
            FileOutputStream fout = new FileOutputStream(datei);
            ObjectOutputStream oos = new ObjectOutputStream(fout);
            oos.writeObject(daten);
            oos.close();
        }
        catch (Exception e) { e.printStackTrace(); }
    }
}

и у меня есть один Runnable, который работает с Reflection, чтобы сделать SwingUtilities.invokeLater() только 1 раз.

public class UpdateRoutine implements Runnable, Serializable {
    private static final long serialVersionUID = 1L;

    List<Map.Entry<Method, Object[]>> updates;

    public UpdateRoutine(){
        updates = new ArrayList<Map.Entry<Method, Object[]>>();
    }

    @Override
    public void run() {
        for(int i = 0; i < updates.size(); i++){
            Entry<Method, Object[]> m = updates.get(i);

            Object[] values = m.getValue();

            try {
                if(values.length == 1){
                    m.getKey().invoke(values[0]);
                }
                else if(values.length == 2){
                    m.getKey().invoke(values[0], values[1].getClass().cast(values[1]));
                }
                else if(values.length == 3){
                    m.getKey().invoke(values[0], values[1].getClass().cast(values[1]), 
                            values[2].getClass().cast(values[2]));
                }
                else if(values.length == 4){
                    m.getKey().invoke(values[0], values[1].getClass().cast(values[1]), 
                            values[2].getClass().cast(values[2]), values[3].getClass().cast(values[3]));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                System.out.println(m.getKey() + " " + values[0]);
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }

    public void addToUpdate(Method m, Object[] args){
        Entry<Method, Object[]> se = new SimpleEntry<Method, Object[]>(m, args);

        updates.add(se);
    }
}

Закрыв приложение, которое я вызываю в Main

addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent windowEvent) {
        userDaten.save();
        System.exit(0);
    }
});

И тогда приходит Исключение

java.io.NotSerializableException: java.lang.reflect.Method
at util.InputOutput.output(InputOutput.java:40)
at training.Person.save(Person.java:55)
at ui.Main$1.windowClosing(Main.java:105)

Это исключение возникает только в том случае, если «File.dat» не существует при первом запуске. Если я не использую UpdateRoutine при первом запуске приложения, «File.dat» может быть сохранен без исключения, и тогда у меня никогда не возникнет этой проблемы.

  1. PersonDaten не имеет import java.lang.reflect.Method . Почему возникает это исключение?
  2. Как избежать этого исключения?

person anatoli    schedule 06.08.2015    source источник
comment
Можешь показать звонок addToUpdate?   -  person Dakshinamurthy Karra    schedule 06.08.2015
comment
Предполагая, что pd является PersonDaten, я не понимаю, как InputOutput.output может выйти из строя. Я подозреваю, что один из ваших SwingUtilities.invokeLater исполняемых файлов выдает это исключение.   -  person Dakshinamurthy Karra    schedule 06.08.2015


Ответы (1)


Решается.

У меня был PersonDaten как внутренний класс.

Сделайте PersonDaten как собственный класс и не имеете проблем.

person anatoli    schedule 06.08.2015