2012-04-28 41 views
0

我試圖使用序列中SerializationFactory GWT一個對象,但我不能得到它的工作。這裏是我的POC的示例代碼:如何使用GWT SerializationStreamFactory

import com.google.gwt.user.client.rpc.SerializationException; 
    import com.google.gwt.user.client.rpc.SerializationStreamFactory; 
    import com.google.gwt.user.client.rpc.SerializationStreamReader; 
    import com.google.gwt.user.client.rpc.SerializationStreamWriter; 
........... 
Some code here.... 
......... 

...... 

SerializationStreamFactory factory = (SerializationStreamFactory) GWT.create(MyClass.class); 
    SerializationStreamWriter writer = factory.createStreamWriter(); 

    try { 
     writer.writeObject(new MyClass("anirudh")); 
     String value = writer.toString(); 


     SerializationStreamReader reader = factory.createStreamReader(value); 

     MyClass myObj = (MyClass) reader.readObject(); 
     System.out.println(myObj.getName()); 
    } catch (SerializationException e) { 
     e.printStackTrace(); 
    } 

它給了我下面的異常

Caused by: java.lang.RuntimeException: Deferred binding failed for 'com.anirudh..client.MyClass' (did you forget to inherit a required module?) 

也是在我的代碼,其目的我想序列化工具IsSerializable

MyClass implements IsSerializable 

我不想使用GWT Auto-Bean框架,因爲它不適合我的用例。另外我沒有使用GWT-RPC框架,現在我非常堅持使用SerializationStreamFactory:D,因爲我非常想知道這個東西是如何工作的。

任何人都可以分享SerializationStreamFactory的工作示例或幫助我,指着我沒有任何錯誤(S)。 預先感謝

回答

2

SerializationStreamFactory工廠=(SerializationStreamFactory)GWT.create(MyClass.class);

你在期待這一行呢? GWT將嘗試查找匹配此類(或when-type-is)的replace-withgenerate-with規則,或者嘗試調用MyClass上的零參數構造函數失敗,實際上是new MyClass()。這是你所期望的嗎?

您粘貼的選定例外表明MyClass可能不在GWT提供的源代碼路徑上編譯,但完整的錯誤日誌將提供更多信息。

看起來好像您試圖模仿生成的RPC代碼,其中*異步rpc接口將由com.google.gwt.user.client.rpc.impl.RemoteServiceProxy(實現SerializationStreamFactory)的代碼實現。該基本實現進一步擴展以初始化幾個字段,例如com.google.gwt.user.client.rpc.impl.Serializer實例,實際負責序列化和反序列化對象流。

序列化器從基類com.google.gwt.user.client.rpc.impl.SerializerBase通過重新綁定類com.google.gwt.user.rebind.rpc.TypeSerializerCreator創建(默認情況下)。如果你已經建立自己的發電機MyClass,你應該踢這個功能得到儘可能ProxyCreator已完成應做的工作。

記住,在構建自己的序列化/反序列化機制時,您需要決定哪些類型可以在此係統中進行編組 - 如果將其打開爲所有類型,則需要爲源上的所有可能對象生成FieldSerializer類型路徑。這將大大擴展編譯代碼的大小。

如果你的主要目標是學習這個「神奇」的工作方式,深入到生活在com.google.gwt.user.rebind.rpc包發電機和相關的代碼。還有其他圖書館可以利用這些想法,如gwt-atmosphere項目(請參閱https://github.com/Atmosphere/atmosphere開始)。還要查看GWT在構建「傳統」RPC接口時創建的生成代碼。

+0

感謝您指出GWT串行器是如何工作的,這將幫助我。 – Durin 2012-04-29 02:58:36