シリアル化は、少なくともあなたが提供している例でうまくいきます。すべてが列挙型になっシリアライズさ/道(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はネットワーク上で転送されないため、GWTは列挙型の内部を気にしません(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で動作することを確信しています。
静的にしましたか? –
これは本当にクールです! JLS(8.9節)では、「ネストされた列挙型は暗黙的に静的です。ネストされた列挙型を静的に明示的に宣言することは許されています。それは 'enum'にネストされた' enum'には当てはまりませんか?それともGWTコンパイラの小さな欠陥ですか? –
... GWTコンパイラはEclipseコンパイラ(ECJ)を使用してソースコードを解析し、ASTを構築するだけです。だから、Eclipseコンパイラには、静的であるとして列挙型を公開しないバグがあります。あるいは、GWTはネストされた列挙型の静的フラグを推測しないというバグを持っています(ECJに行くでしょうが、デザインによるものかもしれない)。 –