如何使用 GWT 序列化流工厂

Posted

技术标签:

【中文标题】如何使用 GWT 序列化流工厂【英文标题】:How to use GWT SerializationStreamFactory 【发布时间】:2012-04-28 18:07:51 【问题描述】:

我正在尝试使用 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】:

SerializationStreamFactory 工厂 = (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.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 接口时创建的生成代码。

【讨论】:

感谢您指出 GWT 序列化程序的工作原理,这将对我有所帮助。

以上是关于如何使用 GWT 序列化流工厂的主要内容,如果未能解决你的问题,请参考以下文章

GWT RPC基础控制流讲解

当我使用 ArrayList 时,如何防止 GWT 尝试包含每个可序列化的类

如何序列化 AutoBean (GWT) 中的列表?

您如何在不同的项目中将 JPA 对象与 GWT 一起使用?

使用 gwt dto 时如何避免使用异步类?

如何将类型添加到 GWT 的序列化策略白名单?