2016-08-19 3 views
0

Ich möchte ArraList<MyClass> in internen Speicher speichern. Also habe ich Serializable in die Klasse implementiert, die die ArrayList und auch die MyClass hat. Der Code sieht wie folgt aus:Speichern serialisierte ArrayList wirft NotSerializableException in Android

public class CustomAdapter extends BaseAdapter implements Serializable { 
public ArrayList<TaskItems> taskList = new ArrayList<TaskItems>(); 
// some fields and variables 
// some methods which use below method saveFile() 
public void saveFile() { 
    try { 
     String filename = "daytodaytasks"; 
     FileOutputStream fileOutputStream = mContext.openFileOutput(filename, Context.MODE_PRIVATE); 
//mContext is MainActivity context 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 
     objectOutputStream.writeObject(taskList); 
     objectOutputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
class TaskItems implements Serializable { 
    String smallRectUpText; 
    String smallRectDownText; 
    String bigRectText; 
    } 
} 

In der Klasse CustomAdapter gibt es Methoden, die savefile() -Methode verwenden. Alle Methoden werden von der Methode MainActivity onClick() mit Klassenreferenz aufgerufen. Wenn ich das Programm verwenden, onClick Methode laufen durch Knopfdruck erhalte ich:

java.io.NotSerializableException: com.something.MainActivity 

Also versuchte ich Serializable zu MainActivity, zu implementieren, aber dann bekam ich die gleiche Ausnahme von AppCompatAcitvity, die MainActivity erstreckt. Kannst du mir helfen ?

Antwort

1

Context Objekte sind nicht Serializable.

Da die Klasse TaskItems nicht statisch ist, kann sie auf CustomAdapter.this zugreifen, d. H. BaseAdapter Objekt, das Context Objekt enthält.

, warum, wenn Sie gemacht BaseAdapter serializable, begann es java.io.NotSerializableException: com.something.MainActivity

Java Doc states

zeigt, wenn eine Kurve durchläuft, kann ein Objekt angetroffen werden, die nicht die Serializable Schnittstelle nicht unterstützt. In diesem Fall wird NotSerializableException ausgelöst und identifiziert die Klasse des nicht serialisierbaren Objekts.

Machen Sie TaskItems eine statische Klasse, dann hat es keinen Zugriff auf CustomAdapter.this von seinem statischen Kontext.

+0

Es funktioniert, aber ich bekomme nicht, warum Klasse TaskItems auf CustomAdapter.this zugreifen. Es hat keinen Bezug zum Kontext. – Michal

+0

Klasse TaskItems ist innere Klasse, daher hat es Zugriff auf äußere Klassenmitgliedsvariablen mit CustomAdapter.this, indem wir die Klasse TaskItems statisch machen, verhindern wir den Zugriff von Membervariablen der äußeren Klasse. – Raman

Verwandte Themen