【发布时间】:2013-03-09 09:58:04
【问题描述】:
我知道Enum 是可序列化的。因此,这样做是安全的。 (selectedCountry 是enum Country)
没有客户成员变量的原始枚举
public enum Country {
Australia,
Austria,
UnitedState;
}
片段
@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 接口的要求提供正确的readObject 和writeObject。
正如 Effective Java 第 75 条:考虑使用自定义序列化表单中所指出的,如果我的枚举中有自定义成员变量,我是否需要提供自己的 readObject 和 writeObject?
【问题讨论】:
-
“它有效”是什么意思?你做了什么测试?