gpt4 book ai didi

java - 自定义枚举也是可序列化的吗?

转载 作者:IT老高 更新时间:2023-10-28 20:25:03 24 4
gpt4 key购买 nike

我了解 Enum 是可序列化的。因此,这样做是安全的。 (selectedCountry 是 枚举国家)

没有客户成员变量的原始枚举

public enum Country {
Australia,
Austria,
UnitedState;
}

fragment

@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
selectedCountry = (Country)savedInstanceState.getSerializable(SELECTED_COUNTRY_KEY);
}
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putSerializable(SELECTED_COUNTRY_KEY, selectedCountry);
}

但是,如果我在自定义枚举类中有不可序列化的成员怎么办?例如,

原始枚举客户成员变量

package org.yccheok;

import org.yccheok.R;

/**
*
* @author yccheok
*/
public enum Country {
Australia(R.drawable.flag_au),
Austria(R.drawable.flag_at),
UnitedState(R.drawable.flag_us);

Country(int icon) {
this.icon = icon;
nonSerializableClass = new NonSerializableClass(this.toString());
}

public int getIcon() {
return icon;
}

public static class NonSerializableClass {
public NonSerializableClass(String dummy) { this.dummy = dummy; }
public String dummy;
}

private final int icon;

public NonSerializableClass nonSerializableClass;
}

我测试过。有用。 (我通过打印出序列化前后成员变量的所有值进行测试,前后一致)

但是,我不明白它为什么起作用?因为我没有按照 Serializable 接口(interface)的要求提供正确的 readObjectwriteObject

正如 Effective Java 第 75 条:考虑使用自定义序列化表单中所指出的,我是否需要提供自己的 readObjectwriteObject,如果我的枚举中有自定义成员变量?

最佳答案

它起作用的原因是 Enum 的序列化过程与其他类的序列化过程不同。来自 official documentation :

1.12 Serialization of Enum Constants

Enum constants are serialized differently than ordinary serializable or externalizable objects. The serialized form of an enum constant consists solely of its name; field values of the constant are not present in the form. To serialize an enum constant, ObjectOutputStream writes the value returned by the enum constant's name method. To deserialize an enum constant, ObjectInputStream reads the constant name from the stream; the deserialized constant is then obtained by calling the java.lang.Enum.valueOf method, passing the constant's enum type along with the received constant name as arguments. Like other serializable or externalizable objects, enum constants can function as the targets of back references appearing subsequently in the serialization stream.

这意味着,您的所有自定义字段不会被序列化。在您的情况下,一切正常,因为您的应用程序进程仍在运行,并且您正在获得传递给 savedInstanceState.putSerializablesame Enum 实例。

但想象一下,您的应用会因为 Android 没有足够的内存而被终止。下次用户打开应用程序时,您将获得一个 new Enum 实例,并且所有自定义字段都将丢失并由构造函数重新初始化。因此,枚举中的可变字段总是有效地transient

关于java - 自定义枚举也是可序列化的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15521309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com