序列化工作得很好,至少在你提供的例子中。所有枚舉以下列方式進行序列化/反序列化(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根本不在乎枚舉內部的東西,因爲它不通過網絡傳輸(枚舉應該是不可變的,不需要傳遞其狀態)。我認爲你的問題可能是這樣的:
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;
}
}
}
這個例子和以前的例子很不一樣。假設在GWT-RPC服務中使用了OuterClass。由於NestedEnum用作OuterClass的字段,所以GWT需要爲它創建一個TypeSerializer。但由於TypeSerializer是一個單獨的類,因此它不具有對NestedEnum的任何訪問權限(因爲它是私有的)。所以編譯失敗。
這基本上是唯一的情況下,當你的例子不會工作。在某些特定的GWT版本中可能會有一些錯誤,但我100%確定您的示例工作在gwt 2.2-2.4。
你有沒有試過讓它變成靜態的? –
這真的很酷! JLS(第8.9節)明確指出「嵌套枚舉類型是隱式靜態的,允許顯式聲明一個嵌套枚舉類型爲靜態。」這不適用於嵌套在'enum'中的'enum',還是它在GWT編譯器中的一個小缺陷? –
...和GWT編譯器只是使用Eclipse編譯器(ECJ)來解析源代碼並構建AST。所以無論Eclipse編譯器有沒有暴露枚舉靜態,或GWT有一個錯誤,不推斷嵌套枚舉的靜態標誌(我會去ECJ,但它確實取決於他們的意圖是什麼;它可能是通過設計)。 –