2011-01-04 9 views
1

Ich entwickle eine App, die einige benutzerdefinierte Klassen als Mitglieder verwendet. Ich habe die Serialisierung/Deserialisierung in den Methoden onSaveInstanceState und onRestoreInstanceState implementiert.Android: Schwerwiegende Ausnahme (NotSerializableException) beim Beenden einer Aktivität, die Objekte in onSave/onRecall serialisiert

Alles funktioniert gut, wenn Sie den Bildschirm drehen (App wird zerstört und neu erstellt) und meine Objekte werden wiederhergestellt. Wenn Sie jedoch die Home-Taste drücken, stürzt die App in der OnPause-Methode ab (die ich nicht geändert habe) ...

Irgendwelche Hinweise, was passiert?

Hier ist ein Codebeispiel, das die Ausgabe

import java.io.Serializable; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class InvestigateError extends Activity { 

    private static final String LOG_TAG = "MYERROR"; 
    protected ShowInfo myShowInfo; 

    protected class ShowInfo implements Serializable 
    { 
     private static final long serialVersionUID = 1L; 
     public String title; 
    } 

    public void populateMembers() 
    { 
     myShowInfo = new ShowInfo(); 
     myShowInfo.title = "Was I serialized???"; 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     if(savedInstanceState == null) 
      populateMembers(); 
     Log.d(LOG_TAG,"Activity created"); 

    } 

    /* Save members */ 
    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     Log.d(LOG_TAG,"__ SAVEINSTANCE __"); 
     outState.putSerializable("myshowInfo", myShowInfo); 
     super.onSaveInstanceState(outState); 
     } 

    /* Restore members */ 
    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     Log.d(LOG_TAG,"__ RECALLINSTANCE __"); 
     myShowInfo = (ShowInfo) savedInstanceState.getSerializable("myshowInfo"); 
     Log.d(LOG_TAG,"string from object: " + myShowInfo.title); 
    } 

    @Override 
    protected void onDestroy() { 
     Log.d(LOG_TAG,"__ DESTROY __"); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 
     Log.d(LOG_TAG,"__ PAUSE __"); 
     super.onPause(); 
    } 

    @Override 
    protected void onStop() { 
     Log.d(LOG_TAG,"__ STOP __"); 
     super.onStop(); 
    } 
} 

Hier ist der Anfang des Stack-Trace

java.lang.RuntimeException reproduziert: Parcel begegnet IOException Schreiben serialisierbares Objekt (name = com.esquared .InvestigateError.InvestigateError $ Showinfo)

bei android.os.Parcel.writeSerializable (Parcel.java:1160)

bei ndroid.os.Parcel.writeValue (Parcel.java:1114)

bei android.os.Parcel.writeMapInternal (Parcel.java:479)

...

+0

Können Sie den Serialisierungscode für ShowInfo anzeigen (ich nehme an, das ist, was serialisiert wird)? –

+0

Der Code, den Sie sehen, ist alles, was dazu gehört. Es gibt keine zusätzliche Methode in der ShowInfo-Klasse, nur Mitglieder. Ich nahm an, dass die Klasse standardmäßig auf ein Array von Bytes serialisiert werden würde ... liege ich falsch? Benötigt es zusätzliche Methoden für den Serialisierungs-/Unserialisierungsprozess? – Damp

+0

Oh, tut mir leid, ich habe die Tatsache übersehen, dass es eine innere Klasse war. Nicht sicher, was das Problem dann ist. Es kann hilfreich sein, wenn Sie den gesamten StackTrace anzeigen. Versuchen Sie auch, Parcelable anstelle von serializable zu verwenden. Es ist ein bisschen mehr Arbeit, aber wesentlich schneller. –

Antwort

3

Sie haben 3 Möglichkeiten:

  1. Stellen als auch die äußere Klasse serialisierbar.

  2. Machen Sie Ihre serialisierbare innere Klasse statisch.

  3. Erstellen Sie eine andere Klasse und machen Sie diese Klasse serialisierbar (eine innere Klasse nicht serialisieren).

Der erste ist eigentlich abgeraten.

Und wie Mayra erwähnt, wird es schneller arbeiten, wenn Sie Parcelable implementieren.

+0

Können Sie mir erklären oder kurz darauf hinweisen, warum die äußere Klasse serialisierbar sein muss? Ich weiß nicht, warum die Aktivitätsklasse zu irgendeinem Zeitpunkt im Lebenszyklus der App serialisiert werden sollte. Gibt es einen Schlüsselmechanismus, der mir hier fehlt? – Damp

+0

Für den Mechanismus dahinter, siehe den Hinweis hier: http://download.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html#4539 – ikarhun

+0

Danke, das erklärt die Notwendigkeit für die äußere Klasse, die serialisierbar sein soll. Es scheint, Parcelable ist eine viel bessere Wahl – Damp

Verwandte Themen