java - GWT SeralizationStreamFactory 读取器问题

标签 java gwt web-worker

我有一个用 GWT 构建的 Web 应用程序,它需要在所有客户端发送和接收序列化数据。 (我使用的是webworkers,需要在主线程和webworkers之间交换数据)

到目前为止,我正在创建序列化对象(在本例中,我只是发送字符串对象的 ArrayList,但我当然是在尝试发送可序列化类对象的数组)

当这一切都发生在客户端时,似乎没有太多关于如何正确使用此序列化/反序列化过程的文档。

但是我的 writer 函数的大致形状是:

    public String streamResult(){
        SerializationStreamFactory factory = GWT.create(streamFactory.class);
        SerializationStreamWriter writer = factory.createStreamWriter();
        ArrayList<String> strlst = new ArrayList<>();
        strlst.add("First String");
        strlst.add("Second String");
        try {
           writer.writeObject(strlst);
        }  catch (Exception e) {
           printf("exception caught while serializing object");
        }
        return  writer.toString();
     }

这正确地创建了一个表示 ArrayList 数据的字符串对象

"7|0|6||788C596190777F280A9EF3D57029FB2C|java.util.ArrayList/4159755760|java.lang.String/2004016611|First String|Second String|1|2|3|2|4|5|4|6|"

但是当我去反序列化结果集时,我收到一个错误,该错误在某种程度上与尝试读取结果字符串中的整数有关。

 public void unStreamResult(String str){
        SerializationStreamFactory factory = GWT.create(streamFactory.class);
        try {
            SerializationStreamReader reader = factory.createStreamReader(str);
            stringArray.addAll((ArrayList<String>) reader.readObject());
        }  catch (Exception e){
            printf("exception caught while deseralizing object");
        }
    }

为 SeralizationStreamFactory 创建的 StreamFactory 类定义为:

@RemoteServiceRelativePath("streamFactory")
public interface streamFactory extends RemoteService {
    ArrayList getMessage(ArrayList message);
    String getMessage(String message);
}

但是在反序列化过程中,我在某种“”字符串上遇到了 NumberFormatException

Error: java.lang.NumberFormatException: For input string: "" at NumberFormatException_0.createError (Insights-0.js:13972) at NumberFormatException_0.initializeBackingError (Insights-0.js:13995) at NumberFormatException_0.Throwable_0 (Insights-0.js:13948) at NumberFormatException_0.Exception_0 (Insights-0.js:14012) at NumberFormatException_0.RuntimeException_0 (Insights-0.js:14022) at NumberFormatException_0.IllegalArgumentException_0 (Insights-0.js:46625) at new NumberFormatException_0 (Insights-0.js:46861) at __parseAndValidateInt (Insights-0.js:22987) at $prepareToRead (Insights-0.js:39707) at $unStreamResult (Insights-0.js:9415) at onMessageImpl (Insights-0.js:46204) at Worker.this$static.onmessage (Insights-0.js:46198)

最佳答案

现有的 GWT-RPC 协议(protocol)是不对称的 - 从客户端到服务器使用一种消息格式,从服务器到客户端使用不同的格式。在我所有的 RPC 工作中,我从来不明白为什么会出现这种情况,除了可能是为了让调试稍微容易一些,因为两种消息格式不兼容,所以你一眼就知道你在寻找什么?

无论如何,这就是为什么这不起作用 - 您的 unStreamResult 需要不同格式的消息,该消息应以 //OK 开头//EX,然后是一个 JS 数组。该数组将主要包含数字,但也会包含字符串数组。

在 GWT-RPC 存储库的更新草稿中,当前位于 https://github.com/vertispan/gwt-rpc (如果该链接过时,请在此答案上留言,我会更新),我们已将流读取器和写入器更改为完全对称。这可以避免您和其他人所面临的困惑,并且可以独立使用序列化格式,例如与 Web Worker 通信,或者对 Blob 进行一些简单的序列化以在 IndexedDb 或其他内容中使用(需要注意的是此格式没有版本化,因此在应用程序更新期间保留的数据可能不再起作用)。

如果您必须在我完成该项目之前使用此格式,请查看类似 https://github.com/niloc132/webbit-gwt/blob/master/workers/src/main/java/com/colinalworth/gwt/worker/client/impl/StreamReader.java 的内容。 (和同一包中的 StreamWriter.java) - 这些只是 AbstractSerializationStreamReaderAbstractSerializationStreamWriter 的子类型,但仔细编写以避免客户端和读取器之间的任何差异。这些是为了使用 ByteBuffers(它们本身包装 JS TypedArrays 以提高性能)而编写的。 gwt-rpc 项目中有一个针对字符串和 ByteBuffer 的“现代化”版本,但它们可能与旧的 RPC 不完全兼容。使用这些也会带来额外的工作:您必须停止使用factory.createStreamWriter()等来为您构建读取器和写入器,然后您必须访问序列化器字段来自 RemoteServiceProxy 子类(也许是 JSNI?)。

<小时/>

但是对于您的 WebSockets 用例,您实际上并不需要完全对称的有线格式 - 您只需通过线路将有效负载发送到服务器并让它对其进行解码,然后制作自己的回复,然后发送返回给客户端。一旦到达客户端,该响应负载将被您的 unStreamResult 消息正确读取。

虽然我从不阻止某人重新发明轮子,但也可以考虑使用我之前链接的 gwt websocket 项目,因为它已经解决了其中许多问题。当然,它并不完美,但随着我们将其成为更新的 GWT-RPC 模块中的一流功能,它已经越来越接近完美。

关于java - GWT SeralizationStreamFactory 读取器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54406183/

相关文章:

javascript - Chrome : className attribute changing not working with GWT

javascript - WebWorkers 的执行似乎比主线程慢得多

javascript - 为什么客户端不会在公用文件夹中收到此脚本的新版本?

java - 如何使 Android 猜谜游戏将猜测次数限制为 3 次尝试,之后将显示一条消息

java - Java 8 流惰性在实践中没有用吗?

java - 对出现白(空白)屏幕的 GWT 进行故障排除

eclipse - 如何防止 superDevMode 出现在我的参数中?

javascript - 通过 webworker 创建通知

java - 通过合并求整数之和

具有控制流枚举的 Java 解析器