Android: фатальное исключение (NotSerializableException) при выходе из действия, которое сериализует объекты в onSave / onRecall - PullRequest
1 голос
/ 05 января 2011

Я занимаюсь разработкой приложения, которое использует несколько пользовательских классов в качестве членов. Я реализовал сериализацию / десериализацию в методах onSaveInstanceState и onRestoreInstanceState.

Все отлично работает при повороте экрана (приложение разрушается и создается заново), а мои объекты восстанавливаются. Однако при нажатии кнопки домой приложение вылетает в методе onPause (который я не изменял) ...

Есть какие-нибудь подсказки о том, что происходит?

Вот пример кода, который воспроизводит проблему

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();
    }
}

Вот начало трассировки стека

java.lang.RuntimeException: Parcelable обнаружил IOException при записи сериализуемого объекта (name = com.esquared.InvestigateError.InvestigateError $ ShowInfo)

на android.os.Parcel.writeSerializable (Parcel.java:1160)

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

на android.os.Parcel.writeMapInternal (Parcel.java:479)

...

1 Ответ

3 голосов
/ 04 февраля 2011

У вас есть 3 варианта:

  1. Сделать внешний класс также сериализуемым.

  2. Сделайте ваш сериализуемый внутренний класс статичным.

  3. Создайте другой класс и сделайте этот класс сериализуемым (не сериализуйте внутренний класс).

Первый действительно не рекомендуется.

И, как упоминала Майра, он будет работать быстрее, если вы реализуете Parcelable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...