2016-07-24 9 views
0

Ich möchte eine Funktion zum Speichern/Laden in meiner Klasse. Ich habe eine private Unterklasse erstellt, in der alle Daten gespeichert werden, die ich speichern möchte.Serialisieren/Deserialisieren eines Unterklassenobjekts in einer Methode in Java

public class MyClass { 

    private class Progress implements Serializable { 
     private static final long serialVersionUID = 1L;  
     boolean val1 = true; 
     int val2 = 0; 
     ArrayList<String> list = new ArrayList<String>(); 
    } 

    private Progress progress = new Progress();  

    public void loadProgress() { 
     progress = null; 
     try 
     { 
      FileInputStream fileIn = new FileInputStream("./tmp/progress.ser"); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      progress = (Progress) in.readObject(); 
      in.close(); 
      fileIn.close(); 
     }catch(IOException i) 
     { 
      i.printStackTrace(); 
      return; 
     }catch(ClassNotFoundException c) 
     { 
      System.out.println("Progress class not found"); 
      c.printStackTrace(); 
      return; 
     } 
    } 

    public void saveProgress() { 
     try 
     { 
      File f = new File("./tmp/progress.ser"); 
      f.getParentFile().mkdirs(); 
      FileOutputStream outputstream = new FileOutputStream(f); 
      ObjectOutputStream out = new ObjectOutputStream(outputstream); 
      out.writeObject(progress); 
      out.close(); 
      outputstream.close(); 
     }catch(IOException i) { 
      i.printStackTrace(); 
     } 
    } 

} 

Aber wenn ich diesen Code ausprobieren mag, gibt es mir java.io.NotSerializableException Ausnahme in der saveProgress() -Methode, und aus diesem Grunde, der loadProgress() -Methode nicht zu arbeiten. Wie kann ich diese Klasse serialisieren?

Antwort

1

Wenn Sie versuchen, eine Instanz einer inneren Klasse zu serialisieren, wird auch die äußere Instanz serialisiert. In Ihrem Fall ist MyClass nicht serialisierbar, so dass es nicht funktioniert. Es gibt zwei mögliche Lösungen:

  • Progress machen eine statische verschachtelte Klasse
  • machen MyClass serializable

Ich habe für den ersten Ansatz argumentieren würde, wenn es möglich ist, da es weniger Daten serialisiert und hat daher bessere Leistung und Platzeffizienz.

1

Äußere Klasse muss auch Serializable sein, da jede innere Klasse einen impliziten Verweis auf die äußere Klasse hat.

Um dies zu lösen, müssen Sie MyClass als Serializable markieren oder Progress eine statische Klasse bilden. Statische Klassen haben keinen Bezug zur äußeren Klasse.

Verwandte Themen