Java Parcelable在写入包含枚举的方法时遇到IOException

Java Parcelable在写入包含枚举的方法时遇到IOException,java,android,serializable,Java,Android,Serializable,有一个枚举: public static enum CheckResult { NONEEDTOUPDATE, FORCEUPDATE, OPTIONALUPDATE; public boolean hasNewVersion() { return this != NONEEDTOUPDATE; } } 然后把它放到另一个类中: public static class UpdateData implements Serializa

有一个枚举:

public static enum CheckResult {
    NONEEDTOUPDATE, 
    FORCEUPDATE, 
    OPTIONALUPDATE;

    public boolean hasNewVersion() {
        return this != NONEEDTOUPDATE;
    } 
}
然后把它放到另一个类中:

public static class UpdateData implements Serializable {
    public static final String BUNDLE_KEY = "UpdateData";
    private static final long serialVersionUID = 7956542923164822779L;
    public String apkDownloadUrl;
    public String newVersionName;
    public CheckResult checkResult;
}
并使用捆绑包发送:

Intent intent = new Intent(context, UpdateActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(UpdateData.BUNDLE_KEY, data);//data is an UpdateData instance
intent.putExtras(bundle);
context.startActivity(intent);
它将导致异常

日志:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.tencent.game3366.update.UpdateChecker$UpdateData)
android.os.Parcel.writeSerializable(Parcel.java:1323)
android.os.Parcel.writeValue(Parcel.java:1271)
android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
android.os.Bundle.writeToParcel(Bundle.java:1692)
android.os.Parcel.writeBundle(Parcel.java:643)
android.content.Intent.writeToParcel(Intent.java:7410)
android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2297)
android.app.Instrumentation.execStartActivity(Instrumentation.java:1437)
android.app.Activity.startActivityForResult(Activity.java:3516)
android.app.Activity.startActivityForResult(Activity.java:3477)
android.support.v4.app.FragmentActivity.startActivityForResult(Unknown Source)
android.app.Activity.startActivity(Activity.java:3719)
android.app.Activity.startActivity(Activity.java:3687)
如果我只是将枚举更改为:

public static enum CheckResult {
    NONEEDTOUPDATE, 
    FORCEUPDATE, 
    OPTIONALUPDATE 
}
一切都好,为什么会这样

更新


<> P>当我重建整个项目时,没有例外发生…………我应该说……< /P> < P> java枚举,不像C++,不是基于整型的值。它本质上是一个类,每个枚举值都作为该类的单例实例。因此,与其比较C++中的基础整型值,不如在比较像

之类的时候比较对象的身份相等性。 A.VALUE\u A==A.VALUE\u B

当您执行枚举比较时。此外,此类枚举类实例是在初始化阶段构造的,这意味着您将始终拥有可用的实例

现在,如果枚举是可序列化的,这意味着它可以从流中反序列化,那么您将面临典型的序列化单例问题。一旦将枚举实例反序列化到主内存中,内存中就会有该实例的两个副本,上面的比较以及所有其他准备枚举的结构,如EnumMap等,如果您使用的是SUN/Oracle JVM,则基于实例等式==和系统hashCode(本质上是默认实现的system.identityHashCode)不再保留任何内容


要在语言级别避免上述问题-这就是为什么不能声明枚举以实现可序列化的原因。

请给出一个具有相应堆栈跟踪的可复制示例。这对我很有用,如果删除static关键字,我可以编译你的枚举。你能告诉我们声明和初始化数据的位置吗?我无法复制它。@zzy您使用的是什么版本的android?我使用的是4.4,我没有得到任何异常与任何版本的CheckResult。你所描述的真的很奇怪。这肯定是个bug。可能与棒棒糖问题有关:所有枚举都实现可序列化。我必须承认我也不知道。我在这个问题下的最初评论现在被删除了,基本上是你的答案。除非有人指出JVM是如何解决上述问题的,否则我对此表示怀疑。如果你想知道这一点,那么就为它创建一个新问题,但它不能解决OPs问题。