Запись перечисления в Посылку, вызывающее RuntimeException

Я только что опубликовал этот вопрос, и кто-то предложил мне взглянуть на другой ответ. В другом ответе он сказал мне, чтобы положить перечисление в посылку как Serializable, (А если вы не понимаете, о чем я говорю, прочитайте пост выше.) Я попытался сделать это так:

protected QuestionOptions(Parcel in) {
    digitCount = in.readInt ();
    operationType = (OperationType)in.readSerializable ();
    boolean[] array = new boolean[1];
    in.readBooleanArray (array);
    timerEnabled = array[0];
}

public static final Creator<QuestionOptions> CREATOR = new Creator<QuestionOptions> () {
    @Override
    public QuestionOptions createFromParcel(Parcel in) {
        return new QuestionOptions (in);
    }

    @Override
    public QuestionOptions[] newArray(int size) {
        return new QuestionOptions[size];
    }
};

public QuestionOptions (OperationType operationType, int digitCount, boolean timerEnabled) {
    this.operationType = operationType;
    this.digitCount = digitCount;
    this.timerEnabled = timerEnabled;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    boolean[] array = {timerEnabled};
    dest.writeBooleanArray (array);
    dest.writeInt (digitCount);
    dest.writeSerializable (operationType);
}

Когда я запускаю свое приложение, оно падает с RuntimeException в соответствии:

operationType = (OperationType)in.readSerializable ();

в QuestionOptions(Parcel in) конструктор. В сообщении об ошибке "Parcelable обнаружена исключительная ситуация IOException при чтении объекта Serializable (name =)". Я попытался поискать это на SO, и я вижу этот вопрос, однако, об использовании списков, и у меня есть enum. Как я могу это сделать?

2 ответа

Решение

Как упомянул Блэкбелт, порядок чтения / записи имеет значение.

Вы можете использовать строковое представление перечисления, чтобы записать его в пакет. Для записи логических переменных вы можете использовать writeByte(). Я положил здесь ответ из вашего предыдущего поста:

protected QuestionOptions(Parcel in) {
    this.operationType = OperationType.valueOf(in.readString());
    this.digitCount = in.readInt();
    this.timerEnabled = in.readByte() != 0;
}

а также

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.operationType.name());
    dest.writeInt(this.digitCount);
    dest.writeByte((byte) (this.timerEnabled ? 1 : 0));
}

Вы должны прочитать содержимое из Parcel Возьмите объект в том же порядке, в котором вы его записали. Сначала логический массив, затем int, а затем значение enum. это

protected QuestionOptions(Parcel in) {
    boolean[] array = new boolean[1];
    in.readBooleanArray (array);
    timerEnabled = array[0];
    digitCount = in.readInt ();
    operationType = (OperationType)in.readSerializable ();
 }

должен сделать это

Другие вопросы по тегам