在GWT-RPC中使用嵌套枚举

luk*_*sen 10 java gwt enums gwt-rpc

我有一个带嵌套枚举的枚举(我想私有),但是当我这样做时,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我从嵌套枚举中删除私有修饰符,则代码可以正常工作.为什么GWT不允许嵌套枚举的私有修饰符?有解决方法吗?

jus*_*sio 2

序列化工作得很好,至少对于您提供的示例是这样。所有枚举都通过以下方式进行序列化/反序列化(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());
}
Run Code Online (Sandbox Code Playgroud)

例如,我并不关心里面用什么。只有序数通过网络传递。这意味着其他地方有问题,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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子与前一个例子非常不同。假设 GWT-RPC 服务中使用了 OuterClass。由于 NestedEnum 用作 OuterClass 的字段,因此 GWT 需要为其创建一个 TypeSerializer。但由于 TypeSerializer 是一个单独的类,因此它无法访问 NestedEnum(因为它是私有的)。所以编译失败。

这基本上是您的示例不起作用的唯一情况。某些特定的 GWT 版本中可能存在一些错误,但我 100% 确定您的示例适用于 gwt 2.2-2.4 。