Java enum上的write parcelable正在使应用程序崩溃

Java enum上的write parcelable正在使应用程序崩溃,java,android,enums,parcelable,Java,Android,Enums,Parcelable,此行是dest.writeParceable(部门、标志)在我通过intent包裹对象时导致应用程序崩溃 当我评论这行时,应用程序会通过,但我当然没有部门价值 public class User implements Parcelable { public String id; public String name; public String email; public Department department; // other implemen

此行是
dest.writeParceable(部门、标志)在我通过intent包裹对象时导致应用程序崩溃

当我评论这行时,应用程序会通过,但我当然没有部门价值

public class User implements Parcelable {

    public String id;
    public String name;
    public String email;
    public Department department;

    // other implementations of Parcelable 

protected UserVO(Parcel in) {
    id = in.readString();
    name = in.readString();
    email = in.readString();
    department = in.readParcelable(Department.class.getClassLoader());
}


    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(id);
        dest.writeString(name);
        dest.writeString(email);
        dest.writeParcelable(department, flags); // crashes
    }
}
部门枚举

public enum Department implements Parcelable {

    SALES("Sales", 1),
    HR("Human Resources", 2),
    SHIPPING("Shipping", 3),

    public final String name;
    public final int ordinal;

    Department(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

    Department(Parcel in) {
        name = in.readString();
        ordinal = in.readInt();
    }

    public static final Creator<Department> CREATOR = new Creator<Department>() {
        @Override
        public Department createFromParcel(Parcel in) {
            return Department.valueOf(in.readString()); // crash
            //return new DeptEnum(in); // android studio generated code but has error: enum types may not be instantiated
        }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(ordinal);
    }
}

你不需要把序号打包。在名字上单独做valueOf就可以了

但是,valueOf的参数必须与枚举定义的名称完全匹配

例如,这适用于销售和运输,但不适用于人力资源

Department.valueOf(in.readString().toUpperCase());

您需要的解决方案是循环遍历
Department.values()
,并将值的每个名称字段与in.readString()结果进行比较

或者您可以像这样使用序数,尽管您复制序数信息,并且必须保证枚举具有序列号

 return Department.values()[in.readInt() - 1]

好的,枚举是可序列化的。尝试删除所有的
包裹
内容,并使用
writeSerializable()
。谢谢,你能帮助我了解代码的编写位置和方法吗?我对这一点不熟悉,你的意思是
dest.writeSerializable(部门)?请同时查看.readParcelable(Department.class.getClassLoader())中的
,这里有什么变化吗?我尝试了
WriteSeriable
,但出现了异常
android.os.BadParcelableException:ParcelableProtocol需要从部门的Parcelable中进行子类化
,还是我应该反过来,依次写和读?为了使其简单易用,无法保证它也不会为null,但是
return Department.values()[in.readInt()-1]
不能为null,这意味着有人没有指定序号?您使用的是枚举,因此需要定义所有值。不管怎样,整数都不能为空。我使用的是序数法,因为你说它对人力资源不起作用,我只想澄清一下你所说的
是什么意思,不能保证它也不会为空
 return Department.values()[in.readInt() - 1]