有一种说法:
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
}一切都好,为什么会这样?
更新
当我重建整个项目时,occur............What也不例外,我应该说.
发布于 2015-01-05 02:39:43
与C++不同,Java不是基于整数的值。它本质上是一个类,每个枚举“值”都是这个类的单例实例。因此,它不是像C++那样比较底层整数值,而是在执行以下操作时比较对象标识相等
A.VALUE_A == A.VALUE_B
当你做比较的时候。此外,此类枚举类实例是在初始化阶段构造的,这意味着您将始终拥有可用的实例。
现在,如果枚举是可序列化的,这意味着它可以从流中反序列化,那么您就会遇到典型的序列化单例问题。一旦您将枚举实例反序列化到主内存中,您将在内存和上面的比较中拥有这样的实例的两个副本,并且您的所有其他枚举就绪结构(如EnumMap等)都不再基于实例相等( == )和系统hashCode() (如果您使用SUN/Oracle,它本质上是用于默认实现的System.identityHashCode() )。
在语言级别上要避免上述问题--这就是为什么不能声明Enum来实现Serializable的原因。
https://stackoverflow.com/questions/27772272
复制相似问题