2012-04-28 6 views
0

GWTでSerializationFactoryを使ってオブジェクトをシリアル化しようとしていますが、動作させることができません。ここに私の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(); 
    } 

それは私のコードでも、私にそのオブジェクト私が実装IsSerializable

MyClass implements IsSerializable 
をシリアル化しようとしているクラスを

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

を以下の例外を与えました

GWT Auto-Beanフレームワークは、私のユースケースに合わないので使いたくありません。また、私はGWT-RPCフレームワークを使用していません。今は、SerializationStreamFactory:Dを使用することについては非常に強く思います。

誰でもSerializationStreamFactoryの実例を共有したり、私が行った間違いを指摘してくれる人がいますか?予め おかげ

答えて

2

SerializationStreamFactory工場=(SerializationStreamFactory)GWT.create(MyClass.class)。

この行に何を期待していますか? GWTは、このクラス(またはwhen-type-isのいずれか)に一致するreplace-withまたはgenerate-withルールを見つけようとします。失敗すると、MyClassでゼロ引数のコンストラクタを呼び出すことになります。new MyClass()これはあなたが期待していることですか?

貼り付けた選択された例外は、MyClassがGWTがコンパイルするために与えられたソースパスにない可能性があることを示していますが、完全なエラーログが詳細を提供します。

生成されたRPCコードを模倣しようとしているかのように見えますが、com.google.gwt.user.client.rpc.impl.RemoteServiceProxySerializationStreamFactoryを実装しています)から拡張されたコードによって*非同期rpcインターフェイスが実装されます。この基本実装は、オブジェクトストリームのシリアライズとデシリアライズを実際に担当するcom.google.gwt.user.client.rpc.impl.Serializerインスタンスなどのいくつかのフィールドを初期化するためにさらに拡張されています。

シリアライザは、基本クラスcom.google.gwt.user.client.rpc.impl.SerializerBaseからrebindクラス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

関連する問題