2015-08-06 3 views
0

У меня есть объект, который я хочу написать в файле: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, что работа с отражением, чтобы сделать 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); 
    } 
} 

тесного Заявление я заехать в главном

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» может быть сохранен без Exception, и тогда у меня никогда не будет этой проблемы.

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

Вы можете показать вызов 'addToUpdate'? – KDM

+0

Предполагая, что 'pd' является' PersonDaten', я не вижу, как «InputOutput.output» может выйти из строя. Я подозреваю, что одно из ваших 'SwingUtilities.invokeLater' runnable выбрасывает это исключение. – KDM

ответ

0

Решение.

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

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

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