如何使用GWT SerializationStreamFactory

时间:2012-04-28 18:07:51

标签: gwt serialization smartgwt gwt-rpc

我正在尝试使用SerializationFactory在GWT中序列化一个对象,但我无法让它工作。以下是我的POC的示例代码:

    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的工作示例,或者帮我指出我做过的任何错误。 提前致谢

1 个答案:

答案 0 :(得分:2)

  

SerializationStreamFactory factory =(SerializationStreamFactory)GWT.create(MyClass.class);

你对这条线有什么期望? GWT将尝试查找与此类匹配的replace-withgenerate-with规则(when-type-assignablewhen-type-is),否则将尝试调用零参数构造函数MyClass,有效new MyClass()。这是你期待的吗?

您粘贴的所选异常表明MyClass可能不在GWT已编译的源路径上,但完整的错误日志将提供更多信息。

看起来好像是在尝试模仿生成的RPC代码,其中* Async 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.SerializerBasecom.google.gwt.user.rebind.rpc.TypeSerializerCreator的基类创建(默认情况下)序列化程序。如果您为MyClass构建自己的生成器,那么您应该开始尝试完成工作,因为ProxyCreator已经应该这样做了。

请记住,在构建自己的序列化/反序列化机制时需要确定哪些类型可以在此系统中进行编组 - 如果将其打开到所有类型,则需要为源路径上的所有可能对象生成FieldSerializer类型。这将大大扩展已编译代码的大小。

如果您的主要目标是了解这个“神奇”的工作原理,请深入了解com.google.gwt.user.rebind.rpc包中的生成器和相关代码。还有其他库可以利用这些想法,例如gwt-atmosphere项目(请参阅https://github.com/Atmosphere/atmosphere开始)。还要检查GWT在构建“传统”RPC接口时生成的代码。