私Enum
はシリアル化可能であることを理解しています。したがって、そうするのは安全です。(selectedCountry is 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;
}
私はテストしました。できます。(シリアル化の前後でメンバー変数のすべての値を出力してテストしました。それらは前後で同じです)
しかし、なぜそれが機能するのか分かりませんか?readObject
私は適切なとを提供しないので、インターフェースwriteObject
で必要とされSerializable
ます。
効果的なJavaアイテム75で指摘されているように、カスタムのシリアル化されたフォームの使用を検討してください。列挙型にカスタムメンバー変数がある場合は、独自readObject
のフォームを提供する必要がありますか?writeObject