Десериализовать ответ сервера - PullRequest
0 голосов
/ 07 мая 2018

Мне интересно, если это способ десериализации ответа сервера. Так что в моем случае у меня есть LinkedHashMap<String,Date> и получение этого с сервера:

 @Override
    public LinkedHashMap<String, Date> testHMap() {
        LinkedHashMap<String, Date> map = new LinkedHashMap<>();
        map.put("AA", new Date());
        map.put("BB", new Date());

        return map;
    }

Я пытаюсь получить информацию о другом приложении (gwt), чтобы я мог выполнять вызовы только через HTTP, а в верхнем примере ответ HTTP выглядит так: //OK['WM577vZ',4,5,2,'WM577vZ',4,3,2,2,0,1,["java.util.LinkedHashMap/3008245022","java.lang.String/2004016611","AA","java.util.Date/3385151746","BB"],0,7]

Итак, есть ли способ получить данные LinkedHashMap из этого HTTP-ответа?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

LinkedHashMap находится в этом ответе - этот ответ является потоком объектов (т. Е. Вместо JSON, если одно и то же значение появляется дважды, оно будет сериализовано только один раз, что позволяет уменьшать содержимое, а также позволяет использовать циклические ссылки вместо только плоское дерево).

Чтение полезной нагрузки RPC выполняется «в обратном направлении» - начиная с конца и читая в обратном направлении, мы начинаем с 7 (версия), 0 (установленные флаги), большого [] строк (строка « table ", строки, необходимые для декодирования ответа, чтобы каждая строка была указана только один раз).

Тогда a 1 - первый объект в потоке - это тип первой записи в таблице строк, т. Е. "java.util.LinkedHashMap/3008245022", как вы ищете. Чтобы декодировать LinkedHashMap, нам сначала нужно узнать, как он упорядочен - следующее значение 0 говорит нам, что он использует значение по умолчанию «insert-order», а затем следующее 2 говорит, что в карта.

Теперь мы повторяем, пока не увидим две пары ключей и значений. Следующее значение скажет нам, какой тип ключа мы ищем: 2 означает, что нужно перейти в таблицу строк, и мы увидим "java.lang.String/2004016611", поэтому мы знаем, что это будет строка, тогда 3 покажет нам "AA" также из таблицы строк. Затем 4, тип значения для этого ключа, как и ожидалось, это "java.util.Date/3385151746" из таблицы строк. Чтобы десериализовать дату, мы читаем long из полезной нагрузки - GWT base64 кодирует их, чтобы уменьшить их размер - это 'WM577vZ', следующий токен.

Следующие 4 токена (2, 5, 4 и 'WM577vZ') повторяют этот процесс, добавляя второй строковый ключ к карте и значение даты для нее.

-

Эта конкретная полезная нагрузка не является той, которая действительно показывает мощность RPC, но ее довольно просто прочитать вручную. Расшифровка их вне GWT-приложения в настоящее время не очень проста (хотя я работаю над обобщенным инструментом, который должен позволять декодировать его где угодно, но на самом деле ответ SO - не то место, где можно об этом говорить) - если вы хотите формат, который может обрабатываться обычным JS или какой-либо другой технологией, не относящейся к GWT, в настоящее время RPC, вероятно, не является вашим лучшим выбором.

0 голосов
/ 07 мая 2018

Я думаю, что вы ищете что-то вроде restyGWT.

Но я не совсем понимаю ваш вопрос, поэтому могу ошибаться.

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