Как читать и писать Enum в посылку на Android?

Вот мой класс модели:

public enum Action {
    RETRY, SETTINGS
}

private int imageId;
private String description;
private String actionName;
private Action action;

public NetworkError(int imageId, String description, String actionName, Action action ) {
    this.imageId = imageId;
    this.description = description;
    this.actionName = actionName;
    this.action = action;
}

public int getImageId() {
    return imageId;
}

public void setImageId(int imageId) {
    this.imageId = imageId;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getActionName() {
    return actionName;
}

public void setActionName(String actionName) {
    this.actionName = actionName;
}


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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.imageId);
    dest.writeString(this.description);
    dest.writeString(this.actionName);
}

protected NetworkError(Parcel in) {
    this.imageId = in.readInt();
    this.description = in.readString();
    this.actionName = in.readString();
}

public static final Parcelable.Creator<NetworkError> CREATOR = new Parcelable.Creator<NetworkError>() {
    @Override
    public NetworkError createFromParcel(Parcel source) {
        return new NetworkError(source);
    }

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

Ответ 1

У меня была аналогичная проблема, и мое решение было:

parcel.writeString(this.questionType.name());

и для чтения:

this.questionType = QuestionType.valueOf(parcel.readString());

QuestionType является перечислением и помнит, что имеет место упорядочение элементов.

Ответ 2

Любой enum является сериализуемым.

Вы можете сделать это в writeToParcel(): dest.writeSerializable(action)

И в конструкторе: action = (Action) in.readSerializable()

Ответ 3

Объявление enum:

public enum Action {

    NEXT(1),
    OK(2);

    private int action;

    Action(int action) {
        this.action = action;
    }

}

Чтение с сайта:

protected ActionParcel(Parcel in) {
    int actionTmp = in.readInt();
    action = Tutorials.Action.values()[actionTmp];
}

Запись на сайт:

public void writeToParcel(Parcel dest, int flags) {
    int actionTmp = action == null ? -1 : action.ordinal();
    dest.writeInt(actionTmp);
}

Ответ 4

Самый эффективный - эффективный пакет памяти создается с использованием порядкового значения ENUM.

Запись на сайт dest.writeInt(enum_variable.ordinal());

Чтение с посылки enum_variable = EnumName.values()[in.readInt()];

Это должно быть хорошо, если вы не учтете предупреждения на документацию:

Посылка не является механизмом сериализации общего назначения. Этот класс (и соответствующий Parcelable API для размещения произвольных объектов в Parcel) разработан как высокопроизводительный транспорт IPC. Таким образом, нецелесообразно помещать какие-либо данные Parcel в постоянное хранилище: изменения в базовой реализации любой из данных в Посылке могут сделать старые данные нечитаемыми.

Другими словами, вы не должны передавать Parcels между версиями кода, потому что это может не сработать.