Использование вложенного перечисления в GWT-RPC - PullRequest
10 голосов
/ 18 октября 2011

У меня есть перечисление с вложенным перечислением (которое я хочу сделать приватным), но когда я делаю это, 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 ]

2 голосов
/ 29 ноября 2011

Сериализация работает просто отлично, по крайней мере, с примером, который вы предоставили.Все перечисления сериализуются / десериализуются следующим образом (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 просто не волнует, что находится внутри enum, потому что он не передается по сети (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.

0 голосов
/ 28 октября 2011

Чтобы быть типом класса параметра RPC, он должен иметь пустой конструктор для сериализации.Поэтому я думаю, если вы добавите

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

Это будет работать!

0 голосов
/ 18 октября 2011

Это, вероятно, связано с JavaScript.Возможно / вероятно, что при переводе в JavaScript вложенный класс записывается как не вложенный.Поэтому, если это личное, ничто другое не имеет к нему доступа.Обходной путь - не делать его закрытым, область видимости по умолчанию должна работать нормально.

...