La serialización funciona bien, al menos con el ejemplo que ha proporcionado. Todo enumeraciones un conseguir serializado/deserializado en siguiente manera (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());
}
P. ej No importa lo que se usa dentro. Solo el ordinal se pasa por la red. Significa que hay un problema en otro lugar, a GWT simplemente no le importa lo que hay dentro de la enumeración, porque no se transfiere a través de la red (la enumeración debe ser inmutable, no hay necesidad de transferir su estado). Creo que su problema podría ser algo como esto:
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;
}
}
}
Este ejemplo es MUY diferente al anterior. Supongamos que OuterClass se usa en el servicio GWT-RPC. Como NestedEnum se usó como campo de OuterClass, GWT necesita crear un TypeSerializer para él. Pero dado que un TypeSerializer es una clase separada, no tiene CUALQUIER acceso al NestedEnum (ya que es privado). Entonces la compilación falla.
Este es básicamente el único caso cuando su ejemplo no funcionará. Puede haber algunos errores en algunas versiones específicas de GWT, pero estoy 100% seguro de que su ejemplo funciona en gwt 2.2-2.4.
¿Has intentado hacerlo estático? –
Esto es realmente genial! El JLS (sección 8.9) dice explícitamente que "los tipos Enum anidados son implícitamente estáticos. Se permite declarar explícitamente que un tipo de enumeración anidado es estático". ¿Eso no se aplica a 'enum's anidado en' enum's o es un defecto menor en el compilador GWT? –
... y el compilador GWT simplemente usa el compilador Eclipse (ECJ) para analizar el código fuente y crear AST. Entonces, o bien el compilador de Eclipse tiene un error al no exponer la enumeración como estática, o GWT tiene un error al no inferir la bandera estática de una enumeración anidada (yo elegiría ECJ, pero realmente depende de cuál sea su intención; podría ser por diseño). –