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