在GWT-RPC中使用嵌套枚举

时间:2011-10-18 10:37:58

标签: 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;
    }
}

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

3 个答案:

答案 0 :(得分: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());
}

E.g。我在里面使用什么并不重要。只有序数通过网络传递。这意味着在其他地方存在问题,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;
        }
    }
}

此示例与之前的示例非常不同。我们假设OuterClass用于GWT-RPC服务。由于NestedEnum用作OuterClass的字段,因此GWT需要为它创建一个TypeSerializer。但由于TypeSerializer是一个单独的类,因此它没有对NestedEnum的任何访问权限(因为它是私有的)。所以编译失败了。

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

答案 1 :(得分:0)

这可能与JavaScript有关。在向JavaScript的转换中,嵌套类可能/可能被编写为非嵌套类。因此,如果它是私有的,则没有其他任何东西可以访问它。解决方法是不将其设为私有,默认范围应该可以正常工作。

答案 2 :(得分:-2)

要成为RPC参数类类型,它必须具有用于序列化的空构造函数。 所以我想,如果你添加

private OuterEnum(){
// may be you should give a default value to nestedValue
}

它会起作用!