首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parcelable遇到IOException写入枚举包含的方法

Parcelable遇到IOException写入枚举包含的方法
EN

Stack Overflow用户
提问于 2015-01-05 01:24:36
回答 1查看 460关注 0票数 1

有一种说法:

代码语言:javascript
复制
public static enum CheckResult {
    NONEEDTOUPDATE, 
    FORCEUPDATE, 
    OPTIONALUPDATE;

    public boolean hasNewVersion() {
        return this != NONEEDTOUPDATE;
    } 
}

把它放到另一个班级:

代码语言:javascript
复制
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;
}

并将其发送到使用包:

代码语言:javascript
复制
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);

这会导致异常。

逻辑猫:

代码语言:javascript
复制
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)

如果我把气变成:

代码语言:javascript
复制
public static enum CheckResult {
    NONEEDTOUPDATE, 
    FORCEUPDATE, 
    OPTIONALUPDATE 
}

一切都好,为什么会这样?

更新

当我重建整个项目时,occur............What也不例外,我应该说.

EN

回答 1

Stack Overflow用户

发布于 2015-01-05 02:39:43

与C++不同,Java不是基于整数的值。它本质上是一个类,每个枚举“值”都是这个类的单例实例。因此,它不是像C++那样比较底层整数值,而是在执行以下操作时比较对象标识相等

A.VALUE_A == A.VALUE_B

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

现在,如果枚举是可序列化的,这意味着它可以从流中反序列化,那么您就会遇到典型的序列化单例问题。一旦您将枚举实例反序列化到主内存中,您将在内存和上面的比较中拥有这样的实例的两个副本,并且您的所有其他枚举就绪结构(如EnumMap等)都不再基于实例相等( == )和系统hashCode() (如果您使用SUN/Oracle,它本质上是用于默认实现的System.identityHashCode() )。

在语言级别上要避免上述问题--这就是为什么不能声明Enum来实现Serializable的原因。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27772272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档