2012-02-21 161 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