преобразование общего объекта gwt в json - PullRequest
2 голосов
/ 21 февраля 2012

Может ли кто-нибудь объяснить мне, почему в GWT вы не можете преобразовать клиентское / разделяемое pojo (которое реализует Serializable) в объект JSON, не перепрыгивая через нагрузку, как при использовании AutoBeanFactory (например, GWT (Client) = How преобразовать Object в JSON и отправить на сервер? ) или создать объекты наложения javascript (и таким образом расширяет JavaScriptObject)

GWT компилирует ваши клиентские объекты в объект javascript, так почему же тогда он не может просто преобразовать ваш javascript в JSON, если вы попросите его?

Предоставленная библиотека GWT JSON позволяет только JSONify java-объекты, расширяющие JavaScriptObject

Я, очевидно, неправильно понимаю что-то о GWT, так как GWT компилирует простой java POJO в объект javascript, а в javascript вы можете JSON.stringify его в JSON, так почему бы не в GWT?

1 Ответ

2 голосов
/ 22 февраля 2012

GWT компилирует ваше приложение, а не просто конвертирует его. Он действительно использует объект prototype в JavaScript для создания классов по мере необходимости, как правило, в соответствии с вашей иерархией классов (и любыми используемыми вами классами GWT), но вносит много других изменений:

Оптимизация:

  • Усиливает типы - если вы ссылаетесь на что-то как List, но это может быть только ArrayList, оно переписывает объявления типов. Это само по себе мало что дает, но позволяет другим шагам работать лучше, например
  • Создание методов статическими - например, если ничто не отменяет ArrayList.add, это превратит любые вызовы, которые он может доказать, в ArrayList.add, в статический вызов, предотвращая необходимость динамической отправки и допуская строку 'this' в последнем JS будет заменено более коротким именем arg. Это предотвратит наличие у объекта JS метода, который вы ожидаете.
  • Встроенные методы - если метод достаточно прост и вызывается в нескольких местах, компилятор может полностью удалить метод, поскольку он знает все места, где он вызывается. Это напрямую повлияет на ваш вариант использования.
  • Удаляет / встраивает несвязанные поля - если вы читаете в поле, но пишете его только один раз, он будет считать, что исходное значение является константой. Если вы не читаете его, нет причин назначать его. Значения, которые компилятор не может сказать, когда-либо будут использоваться, не должны занимать место в js и время в браузере. Это также напрямую повлияет на трактовку gwt'd Java как JS.

После этого, помимо прочего, компилятор будет переименовывать поля, аргументы и типы, чтобы быть как можно меньшим - редко, когда поле или аргумент будут длиннее 1 символа, когда они завершены, поскольку они наиболее часто используются и имеют наименьшая область действия, поэтому компилятор может использовать ее чаще всего. Это также повлияет на попытки обработать объекты как JSON.

Библиотеки, которые позволяют экспортировать объекты GWT в формате JSON, делают это, делая некоторые другие предположения.

  • JavaScriptObject (JSO) не является реальным объектом Java, но на самом деле представляет собой экземпляр JavaScript, так что вы можете приводить туда-сюда по своему усмотрению - написанный вами JSNI будет относительно неоптимизированным, так как компилятор не может определить, пытаются общаться с внешней библиотекой.
  • AutoBeans создаются для того, чтобы предполагать, что они должны иметь возможность записывать JSON, поэтому в них записываются определенные методы кодирования объектов. Они будут подчиняться тем же правилам, что и другая компилируемая Java - код, который не является используемый может быть удален, код, который вызывается только одним способом, может быть сжат или встроен.
  • Библиотеки, которые могут экспортировать JS-компиляцию в деталях Java в конечный исполняемый файл, увеличивая его, но предоставляя вам возможность обрабатывать эти объекты Java как JS некоторым ограниченным образом.

И последнее замечание, поскольку вы говорите как о JSON, так и о Javascript. Некоторые обычные JS не подходят для записи в формате JSON. У объектов Date нет последовательного способа сериализации, который распознается JSON. Графы объектов не из дерева не могут быть сериализованы:

var obj = {};
obj.prop = {};
obj.prop.obj = obj;

Autobeans поставляется со встроенным средством проверки для этих циклических ссылок, и я надеюсь, что сериализация JSO делает то же самое.

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