2012-02-21 2 views
2

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

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

Библиотека GWT JSON поставляется только позволяет объектам JSONify ява, которые расширяют JavaScriptObject

Я, очевидно, недоразумение что-то о GWT начиная с GWT компилирует простой Java POJO в JavaScript Object и в JavaScript вы можете JSON.stringify это в JSON, так почему бы и нет в GWT?

ответ

2

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

оптимизаций:

  • Затягивает типы - если вы ссылаетесь на что-то как List, но это может быть только ArrayList, он переписывает объявления типов. Это само по себе не дает многого, но позволяет другим шагам работать лучше, например
  • Создание методов static - если ничто никогда не отменяет ArrayList.add, например, это превратит любые вызовы, которые он может доказать, - это ArrayList.add в статический вызов, предотвращающий необходимость динамической отправки и позволяющий заменять «эту» строку в конечном JS более коротким именем arg. Это предотвратит наличие у объекта JS метода, который вы ожидаете от него.
  • Inline Methods - если метод достаточно прост и вызывается в нескольких местах, компилятор может полностью удалить этот метод, поскольку он знает все места, где он вызывается. Это напрямую повлияет на ваш прецедент.
  • Удаляет/не строит поля без ссылок - если вы читаете поле, но только пишете его один раз, оно будет считать, что исходное значение является константой. Если вы его не читаете, нет причин для его назначения. Значения, которые компилятор не может сказать, никогда не будут использоваться, не нужно использовать пространство в 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. Non-дерево графы объекта не могут быть сериализовать:

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

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

+0

большое спасибо за это. Теперь имеет смысл. – paul