01: import java.io.ObjectStreamException; 02: import java.io.Serializable; 03: import java.lang.reflect.Field; 04: 05: /** 06: This class is a superclass for enumerated types that 07: can be serialized. Subclass like this: 08: <pre> 09: public class MyEnumeration extends SerializableEnumeration 10: { 11: private MyEnumeration() {} 12: public static final MyEnumeration FOO = new MyEnumeration(); 13: public static final MyEnumeration BAR = new MyEnumeration(); 14: . . . 15: } 16: </pre> 17: This defines instances <code>MyEnumeration.FOO</code> and 18: <code>MyEnumeration.BAR</code> that are guaranteed to 19: be preserved through serialization and deserialization. 20: Conveniently, the toString method yields the name (such 21: as <code>"FOO"<code>). 22: */ 23: public class SerializableEnumeration implements Serializable 24: { 25: protected Object writeReplace() throws ObjectStreamException 26: { 27: if (name == null) toString(); 28: if (name == null) 29: throw new ObjectStreamException("No matching field") {}; 30: return this; 31: } 32: 33: public String toString() 34: { 35: if (name != null) return getClass().getName() + "." + name; 36: try 37: { 38: Field[] fields = getClass().getFields(); 39: for (int i = 0; i < fields.length; i++) 40: { 41: if (fields[i].get(this) == this) 42: { 43: name = fields[i].getName(); 44: return toString(); 45: } 46: } 47: } 48: catch (IllegalAccessException ex) {} 49: return super.toString(); 50: } 51: 52: protected Object readResolve() throws ObjectStreamException 53: { 54: try 55: { 56: return getClass().getField(name).get(null); 57: } 58: catch (IllegalAccessException ex) {} 59: catch (NoSuchFieldException ex) {} 60: throw new ObjectStreamException("No matching field") {}; 61: } 62: 63: private String name; 64: }