Подтвердить что ты не робот

Формат данных GWT RPC

Как выглядит формат данных для вызовов RPC Google Web Toolkits (GWT) и как передаются объекты IsSerializable. Я знаю, что Java Serializable передает какой-то двоичный формат, но так ли это с GWT? (Поскольку я не ожидаю, что он будет совместим с JavaScript или, по крайней мере, потребует некоторого дополнительного синтаксического анализа).

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ: Брайан Слесинский просто задокументировал протокол (путем обратного проектирования кода): https://docs.google.com/document/d/1eG0YocsYYbNAtivkLtcaiEE5IOF5u4LUol8-LL0TIKU/edit

Во-первых, протокол GWT-RPC является асимметричным, поэтому он всегда оптимизирован для клиентской стороны: быстро десериализуйте что-то, поступающее с сервера, и быстро сериализуйте что-то, чтобы отправить его.

Это, очевидно, не двоичный, как вы подозревали, а текстовый. протокол "клиент-сервер" разделяется по каналам, в то время как сервер-клиент основан на JSON (с префиксом //OK или //EX, чтобы определить, был ли запрос успешным или неудачным). Оба используют общие знания сериализуемых классов для сериализации/десериализации; например, обе стороны знают, что класс X имеет два поля, целое число и строку, сериализованные в этом порядке, поэтому они оба записывают/читают целое число, а затем строку, без необходимости указывать в закодированном формате, о.

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

Лучшая документация - это код, но вы найдете обзор формата запроса в этих слайдах: https://www.owasp.org/images/7/77/Attacking_Google_Web_Toolkit.ppt

RequestFactory, вопреки GWT-RPC, использует симметричный JSON-протокол (основанный на сериализации AutoShare JSON), где клиент и сервер могут связываться даже тогда, когда они не скомпилированы из одного и того же кода (ну, в зависимости от изменений, внесенных вами в версиях, конечно), потому что они передают имена классов и свойств.