我理解Enum是Serializable.因此,这样做是安全的.(selectedCountry是enum Country)
public enum Country {
Australia,
Austria,
UnitedState;
}
Run Code Online (Sandbox Code Playgroud)
@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);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在自定义枚举类中有非可序列化成员,该怎么办?例如,
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;
}
Run Code Online (Sandbox Code Playgroud)
我测试过了.有用.(我通过在序列化之前和之后打印出成员变量的所有值来测试.它们在之前和之后是相同的)
但是,我不明白它为什么有效?由于我不提供适当的readObject和writeObject所要求的Serializable接口.
作为有效的Java指出项目75:考虑使用自定义序列化形式,我是否需要提供我自己的readObject和writeObject,如果我有自定义的成员变量在我的枚举?
Vla*_*nov 91
它的工作原理是,序列Enum化过程与其他类的序列化过程不同.从官方文档:
1.12枚举常量的序列化
枚举常量的序列化与普通的可序列化或可外部化的对象不同.枚举常量的序列化形式仅由其名称组成; 常量的字段值不存在于表单中.要序列化枚举常量,ObjectOutputStream会写入枚举常量名称方法返回的值.要反序列化枚举常量,ObjectInputStream从流中读取常量名称; 然后通过调用java.lang.Enum.valueOf方法获取反序列化的常量,将常量的枚举类型与接收的常量名称一起作为参数传递.与其他可序列化或可外部化的对象一样,枚举常量可以作为随后出现在序列化流中的反向引用的目标.
这意味着,您的所有自定义字段都不会被序列化.在您的情况下,一切都运行正常,因为您的应用程序进程仍在运行,并且您获得了传递给的相同 Enum实例savedInstanceState.putSerializable.
但想象一下你的应用程序被杀死的情况,因为Android没有足够的内存.下次用户打开应用程序时,您将获得一个新 Enum实例,并且构造函数将丢失并重新初始化所有自定义字段.因此,枚举中的可变字段总是有效的transient.
san*_*tar 10
按序列化的文档,readObject并且writeObject是没有必要的,所以你的问题可能是不完全正确.
Serializable是一个标记界面,没有任何方法.
我向您推荐这个答案,它提供了有关序列化实现的更多详细信息(这解释了为什么您不需要写入和读取功能).
而且,正如提到这里由戴安Hackborn,Parcelable是Android更有效.
如果您对Enum特别感兴趣,请参阅以下段落:
1.12枚举常量的序列化
枚举常量的序列化与普通的可序列化或可外部化的对象不同.枚举常量的序列化形式仅由其名称组成; 常量的字段值不存在于表单中.要序列化枚举常量,ObjectOutputStream会写入枚举常量名称方法返回的值.要反序列化枚举常量,ObjectInputStream从流中读取常量名称; 然后通过调用java.lang.Enum.valueOf方法获取反序列化的常量,将常量的枚举类型与接收的常量名称一起作为参数传递.与其他可序列化或可外部化的对象一样,枚举常量可以作为随后出现在序列化流中的反向引用的目标.
无法自定义枚举常量序列化的过程:在序列化和反序列化期间,将忽略由枚举类型定义的任何特定于类的writeObject,readObject,readObjectNoData,writeReplace和readResolve方法.同样,任何serialPersistentFields或serialVersionUID字段声明也会被忽略 - 所有枚举类型都有一个固定的serialVersionUID为0L.记录枚举类型的可序列化字段和数据是不必要的,因为发送的数据类型没有变化.
所以,我不认为Enum测试内部非可序列化类的工作是正确的选择.
| 归档时间: |
|
| 查看次数: |
57952 次 |
| 最近记录: |