2012-02-21 160 views
2

有人可以向我解释为什么在GWT中,您无法像使用AutoBeanFactory(例如GWT (Client) = How to convert Object to JSON and send to Server?)或者使用AutoBeanFactory一样跳过一堆箍环来将客户端/共享pojo创建JavaScript的覆盖对象(等扩展JavaScriptObject)将gwt共享对象转换为json

GWT编译你的客户对象到一个JavaScript对象,那么为什么不能把它然后只需你的JavaScript转换成JSON,如果你问它?

唯一提供的GWT JSON库允许你扩展JavaScriptObject

我显然误解的东西有关GWT因为GWT编译一个简单的Java POJO成JavaScript对象,并在JavaScript中,你可以JSON.stringify JSONify Java对象它到JSON为什么不在GWT?

回答

2

GWT编译你的应用程序,它不只是转换。它利用prototype对象的JavaScript来构建类,因为它需要,通常是按照你的类层次结构(和你使用任何GWT类),但它使许多其他变化:

优化:

  • 收紧类型的 - 如果你指的东西作为List,但它只能是一个ArrayList,重写类型声明。这本身犯规给多少,但它可以让其他步骤做的更好的工作,如
  • 制作方法静态 - 如果什么事也没覆盖ArrayList.add,例如,这将打开它可以证明任何电话都ArrayList.add成一个静态调用,防止动态调度的需要,并允许在最后JS的“这个”字符串是用更短的ARG替换名称。这会阻止JS对象拥有你期望的方法。内联方法 - 如果一个方法足够简单,并且在足够少的地方调用,编译器可能完全移除该方法,因为它知道调用它的所有地方。这将直接影响你的用例。
  • 中移除了/内联未引用的领域 - 如果你阅读到现场,但只写一次,它会假定原来的值是一个常数。如果你没有阅读它,没有理由分配它。编译器无法分辨的值将永远不会被使用在js中的空间和浏览器中的时间。这也将直接影响将gwt'd Java作为JS处理。

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

允许您将GWT对象导出为JSON的库通过做出其他假设来做到这一点。

  • JavaScriptObject(JSO)是不是一个真正的Java对象,但实际上代表了JavaScript的情况下,这样你就可以随意施展来回 - 你写的JSNI将出现相对未优化,因为编译器不能告诉你是否试图与外部图书馆交谈。
  • 生成的AutoBeans假定它们应该能够写出JSON,因此编写对象的特定方法被写入。它们将遵循与编译的其他Java相同的规则 - 未使用的代码可能会被删除,仅被称为一种方式的代码可能会被收紧或内联。
  • 可以导出JS的库以Java的细节编译到最终的可执行文件中,使其更大,但让您能够以某种有限的方式处理JS这些Java对象。

最后一点,既然你讲的都是关于JSON和Javascript - 一些普通的JS并不适合写成JSON。日期对象没有一致的方式来序列化,可以被JSON识别。非树对象图无法序列:

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

Autobeans配备了一个内置的检查,这些循环引用,我会希望JSO序列化操作为好。

+0

非常感谢。现在完美。 – paul 2012-02-22 10:25:55