我有一个带嵌套枚举的枚举(我想私有),但是当我这样做时,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不允许嵌套枚举的私有修饰符?有解决方法吗?
答案 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
}
它会起作用!