2012-05-04 1 views
1

У меня есть некоторые Serializable объекты, которые я использую с механизмом RPC GWT. Я решил сделать их всем подклассом Объектом, содержащим общие поля, такие как «id», «revision» и т. Д. Однако я заметил, что GWT не сериализует поля суперкласса, поэтому я просто получаю каждый класс суперкласса как нуль на стороне клиента.Как сериализовать поля суперклассов, а также сериализуемый класс

Как я могу получить поля суперкласса, также сериализованные без необходимости писать CustomFieldSerializer для каждого из моих классов Serializable? Является ли это возможным?

Пример:

public class Super { 
    private String id; 

    public String getId() { 
     return id; 
    } 

} 

public class Sub extends Super implements Serializable { 
    private String name; 

    // more stuff here 
} 


// on the client side, inside an AsyncCallback 
onSuccess(Sub sub) { 
    assert(sub.getId() != null); 
} 

Так что, когда я посылаю это через механизм RPC GWT к клиентской стороне, я получаю нулевое значение в поле «ид» любого экземпляра Sub. Я гарантировал, что на сервере id не равен нулю. Я также попытался сделать суперклассом Serializable, без везения.

Любые советы приветствуются.

+0

Пожалуйста, покажите нам минимальный фрагмент кода, который надежно демонстрирует проблему. –

+1

Это так просто, я не думал, что это будет необходимо ... но я все равно добавлю. – Renato

ответ

1

Для сериализации любого класса в gwt вам необходимо реализовать Serializable в суперклассе.

Чтобы передать фасоль, вы должны выполнить следующие требования (с сайта GWT):

1.It инвентарем либо Java Serializable или GWT IsSerializable интерфейса, либо непосредственно, либо потому, что оно происходит от суперкласса, что делает.

2.Its неконечное, не преходящие поля экземпляра сами сериализуемая

3.It имеет по умолчанию (нулевой аргумент) конструктор с любым модификатором доступа (например, частный Foo() {} будет работать)

Проблема может иметь разные причины.

1.Verify, что класс имеет конструктор по умолчанию (без аргументов)

2.Verify, что класс реализует Serializable или IsSerializable или реализует интерфейс, который расширяет Сериализуемый или расширяет класс, которые реализуют Serializable

3. Убедитесь, что класс находится в клиенте. * Package или ...

4. Верните, если класс не находится в клиентском * пакете, который скомпилирован в вашем определении модуля XML GWT. По умолчанию присутствует. Если ваш класс находится в другом пакете, вы должны добавить его в исходный код. Например, если ваш класс находится в домене. * Вы должны добавить его в xml as. Имейте в виду, что класс не может принадлежать серверному пакету!

5.Если вы включаете класс из другого проекта GWT, вы должны добавить наследования к определению вашего xml-модуля. Например, если ваш класс Foo находится в пакете com.dummy.domain, вы должны добавить его в определение модуля.

6.Если вы включаете класс из другого проекта GWT, выпущенного в виде банки, убедитесь, что в банке также содержится исходный код, поскольку GWT перекомпилирует также источник Java для классов, переданных клиенту.

+0

Не работает, пробовал это .... – Renato

+0

Была еще одна проблема с полем в Super, который мешал мне сделать это Serializable ... после исправления этой проблемы и создания Super Serializable, это действительно сработало ... – Renato

0

Если вы хотите, чтобы данные в Super были сериализованы, вы должны сделать это Serializable.

Смежные вопросы