Gwt сериализация - PullRequest
       4

Gwt сериализация

1 голос
/ 08 декабря 2011

У меня есть класс Data, который реализует интерфейс Serializable.В этом классе есть такие поля

    private boolean q = false;
    private String a = "";
    private List<Someclass> m = Collections.emptyList();
    private List<Object[]> d = Collections.emptyList();

Значения, назначенные этим членам, являются значениями по умолчанию.Класс Someclass также реализует Serializable и имеет такие столбцы

   private Types sqlType;
    private int columnWidth;
    private String columnName;

Types - это перечисление, которое также реализует сериализуемый.в котором я буду сохранять данные, извлеченные из базы данных через jdbc (при итерации ResultSet я использую метод getObject()).Я использую такую ​​конструкцию, потому что она может выполнять любой запрос (структура запроса неизвестна).В List<Someclass> m я держу метаду запроса.Поэтому, когда я пытаюсь получить строки с помощью простого запроса, я получаю

com.google.gwt.user.client.rpc.SerializationException: Type '[Ljava.lang.Object;' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [Ljava.lang.Object;@127053a9

Почему это происходит?Все мои объекты передачи являются сериализуемыми.

edit Ok, Object не Serializable, поэтому его нельзя передать и вернуть с сервера.Но что я должен использовать в этом случае.Обобщения не помогут мне, потому что я не знаю тип во время компиляции

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Для того чтобы класс был сериализуемым, практически все, что вы можете получить от него, также должно быть сериализуемым. В этом случае Object не сериализуем, что делает Object [] не сериализуемым, что делает List не сериализуемым, что делает данные не сериализуемыми.

Подумайте об этом так: если вы не можете сериализовать данный Объект в Объекте [], как вы собираетесь сериализовать Объект []? И если вы не можете сериализовать это, как вы собираетесь сериализовать список этого? И если вы не можете сериализовать этот список, как вы собираетесь сериализовать то, что содержит этот список?

Теперь может случиться так, что все в вашем Object [] окажется сериализуемым - но так, как вы его напечатали, компилятор не может этого гарантировать.

РЕДАКТИРОВАТЬ: Что касается того, что вы должны использовать вместо этого, я бы создал некоторый класс-оболочку, которая будет содержать результаты запроса SQL, и сделать этот сериализуемый.

0 голосов
/ 08 декабря 2011

Вы не можете использовать List здесь, потому что Object [] не сериализуем.

Вам необходимо создать другой, сериализуемый класс, который может содержать любое значение столбца, полученное в результате запроса.

Возможно, что-то вроде:

public abstract class ColumnValue implements Serializable
{
    public abstract Object getValue();
}

public class IntColumnValue extends ColumnValue
{
    private Integer _intValue;
    public Object getValue()
    {
         return _intValue;
    }
}

.
.
.

Вы создаете подкласс ColumnValue для каждого типа столбца, который может быть возвращен. Когда у вас есть массив Object [], вы перемещаете его в массив ColumnValue [], выбирая правильный подтип для каждого значения на основе метаданных из запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...