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)
...
Können Sie den Serialisierungscode für ShowInfo anzeigen (ich nehme an, das ist, was serialisiert wird)? –
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
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. –