带序列化的 GWT

Posted

技术标签:

【中文标题】带序列化的 GWT【英文标题】:GWT with Serialization 【发布时间】:2016-06-09 13:15:24 【问题描述】:

这是我的客户端代码,用于通过 RPC 调用获取字符串“get-image-data”并从服务器获取byte[]

CommandMessage msg = new CommandMessage(itemId, "get-image-data");
cmain.ivClient.execute(msg, new AsyncCallback<ResponseMessage>() 

    @Override
    public void onFailure(Throwable caught) 

    

    @Override
    public void onSuccess(ResponseMessage result) 
        if (result.result) 
            result.data is byte[].
        
    
);

从服务器端我得到的数据长度是 241336。 但我无法在onSuccess 方法中获得值。它总是使用onFailure 方法。

我登录了 Apache:

com.google.gwt.user.client.rpc.SerializationException: 类型“[B”是 不包含在可以由此序列化的类型集中 无法加载 SerializationPolicy 或其 Class 对象。

如何在 GWT 中进行序列化?

【问题讨论】:

ResponseMessage 长什么样子?该错误表示 byte[] cant 通过网络发送,在您的情况下,服务器表示不允许它发送该数据。 您使用的是什么版本的 GWT?我的直觉告诉我 byte[] 应该是可序列化的,但我会检查一下。 byte[] 绝对是可序列化的。 developerlife.com/tutorials/?p=131 检查您的浏览器是否缓存了旧编译的 JS。执行 Ctrl-F5 刷新缓存,它可能会起作用。 可能可序列化,但前提是 rpc 服务已声明它是允许服务器发送的东西。 【参考方案1】:

1) 创建一个实现 Serializable 接口的 pojo 让这个 pojo 在 RPC 服务的响应中拥有你想要的所有数据,在本例中为 image-data

2) 在您的 RPC 服务的响应中传递这个 pojo。

下面的教程有足够的信息来创建 RPC 服务 http://www.gwtproject.org/doc/latest/tutorial/RPC.html

【讨论】:

【参考方案2】:

    您传入和传出服务器的对象必须实现 IsSerializable。

    您要传输的对象中的所有自定义对象也需要实现 IsSerializable。

    您的对象不能有最终字段,并且需要无参数构造函数。

    您需要 getter 和 setter。

GWT 中常见的序列化对象:

public class MyClass implements IsSerializable 

       private String txt;
       private MyOtherClass myOtherClass; // Also implements IsSerializable

       public MyClass() 

       

       public String getTxt() 
           return this.txt;
       

       public void setTxt(String txt) 
           return this.txt = txt;
       

       public String getMyOtherClass() 
           return this.myOtherClass;
       

       public void setMyOtherClass(MyOtherClass myOtherClass) 
           return this.myOtherClass = myOtherClass;
       

【讨论】:

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

如何使用 GWT 序列化流工厂

GWT:序列化异常

GWT 中的 BigDecimal 序列化

GWT 序列化异常

GWT 序列化问题

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