将gwt共享对象转换为json

时间:2012-02-21 09:56:05

标签: json gwt

有人可以向我解释为什么在GWT中你不能将客户端/共享pojo(实现Serializable)转换为JSON对象,而不会像使用AutoBeanFactory(例如GWT (Client) = How to convert Object to JSON and send to Server?)或创建javascript那样跳过一堆箍覆盖对象(以及扩展JavaScriptObject)

GWT将你的客户端对象编译成一个javascript对象,那么为什么它不能简单地将你的javascript转换为JSON呢?

提供的GWT JSON库只允许您JSONify扩展JavaScriptObject的Java对象

我显然误解了GWT,因为GWT将一个简单的Java POJO编译成一个javascript对象,而在javascript中你可以将它JSON.stringify为JSON,为什么不在GWT中呢?

1 个答案:

答案 0 :(得分:2)

GWT编译你的应用程序,它不只是转换它。它利用JavaScript中的prototype对象来构建所需的类,通常遵循您的类层次结构(以及您使用的任何GWT类),但它会进行许多其他更改:

优化:

  • 收紧类型 - 如果您将某些内容称为List,但它只能是ArrayList,则会重写类型声明。这本身并没有给予太多,但它让其他步骤做得更好,例如
  • 使方法成为静态 - 例如,如果没有任何东西覆盖ArrayList.add,这将把它可以证明的任何调用转换为ArrayList.add进入静态调用,防止需要动态调度,并允许'this'字符串在最终的JS中用一个较短的arg名称替换。这将阻止JS对象拥有您期望它拥有的方法。
  • 内联方法 - 如果方法足够简单,并且在足够少的位置调用,编译器可能会完全删除该方法,因为它知道调用它的所有位置。这将直接影响您的使用案例。
  • 删除/内联未引用的字段 - 如果您读取某个字段但只写入一次,则会认为原始值是常量。如果您没有阅读它,则没有理由进行分配。编译器无法分辨的值不需要在浏览器中使用js和time中的空间。这也将直接影响gwt'd Java作为JS。

在这些之后,编译器会将字段,参数和类型重命名为尽可能小 - 当完成时,字段或参数很少会超过1个字符,因为那些是最常用的并且具有最小的范围,因此可以由编译器最经常地重用。这也会影响尝试将对象视为JSON。

允许您将GWT对象导出为JSON的库通过做出其他假设来实现。

  • JavaScriptObject(JSO)不是真正的Java对象,但实际上代表了一个JavaScript实例,所以你可以随意来回转换 - 你编写的JSNI会相对不优化,因为编译器无法判断你是否正试图与外部图书馆交谈。
  • 生成AutoBeans以假设它们应该具有写出JSON的能力,因此编写对象的特定方法将被写入。它们将遵循与编译的其他Java相同的规则 - 代码不是使用可能会被删除,只有一种方式调用的代码可能会被收紧或内联。
  • 可以将JS编译的Java编译到最终的可执行文件中,使其更大,但是让您能够以某种有限的方式处理这些Java对象,如JS。

最后一点,既然你在谈论JSON和Javascript - 一些普通的JS不适合写出JSON。日期对象没有一致的JSON识别序列化方法。非树对象图无法序列化:

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

Autobeans带有这些循环引用的内置检查器,我希望JSO序列化也可以。