Сериализация работает просто отлично, по крайней мере, с примером, который вы предоставили.Все перечисления сериализуются / десериализуются следующим образом (GWT 2.4, 2.3, 2.2):
public static OuterEnum instantiate(SerializationStreamReader streamReader) throws SerializationException {
int ordinal = streamReader.readInt();
OuterEnum[] values = OuterEnum.values();
assert (ordinal >= 0 && ordinal < values.length);
return values[ordinal];
}
public static void serialize(SerializationStreamWriter streamWriter, OuterEnum instance) throws SerializationException {
assert (instance != null);
streamWriter.writeInt(instance.ordinal());
}
Например, мне неважно, что используется внутри.Только порядковый номер передается по сети.Это означает, что есть проблема в каком-то другом месте, GWT просто не волнует, что находится внутри enum, потому что он не передается по сети (enum должен быть неизменным, нет необходимости передавать его состояние).Я думаю, что ваша проблема может быть примерно такой:
public class OuterClass implements Serializable{
private OuterEnum.NestedEnum nested;
private OuterEnum outer;
public enum OuterEnum {
A(NestedEnum.X), B(NestedEnum.Y), C(NestedEnum.X);
NestedEnum nestedValue;
private OuterEnum(NestedEnum nv) {
nestedValue = nv;
}
private enum NestedEnum {
X, Y;
}
}
}
Этот пример ОЧЕНЬ отличается от предыдущего.Предположим, что OuterClass используется в сервисе GWT-RPC.Поскольку NestedEnum используется в качестве поля OuterClass, GWT необходимо создать для него TypeSerializer.Но поскольку TypeSerializer является отдельным классом, он не имеет ЛЮБОГО доступа к NestedEnum (поскольку он является закрытым).Таким образом, сборка не удалась.
Это в основном единственный случай, когда ваш пример не сработает.В некоторых конкретных версиях GWT могут быть некоторые ошибки, но я на 100% уверен, что ваш пример работает в gwt 2.2-2.4.