我有一个枚举与嵌套枚举(我想要私有),但是当我这样做GWT告诉我,嵌套的枚举是不可见的并且引发异常.
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 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),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版本中可能会有一些错误,但我确信您的示例在gwt 2.2-2.4中有效.