反序列化GoogleWebKit响应(Java)和Javaservlet

反序列化GoogleWebKit响应(Java)和Javaservlet,java,servlets,serialization,gwt,Java,Servlets,Serialization,Gwt,我有一个需要读取和提交数据的单片遗留应用程序。它使用谷歌网络工具包和Java servlet。 我可以访问源代码,但我对servlet和GWT都是新手 我试图在我的项目中封装一个rest客户机,它可以与传统服务器的GET/POST rest调用进行通信 我已经能够使用Postman发送POST请求,然后使用反应式Spring5.0框架发送该请求 当我尝试反序列化响应时,我会遇到大量错误 如何反序列化此有效负载? 7|0|7|http://localhost:8080/testproject/ |

我有一个需要读取和提交数据的单片遗留应用程序。它使用谷歌网络工具包和Java servlet。 我可以访问源代码,但我对servlet和GWT都是新手

我试图在我的项目中封装一个rest客户机,它可以与传统服务器的GET/POST rest调用进行通信

我已经能够使用Postman发送POST请求,然后使用反应式Spring5.0框架发送该请求

当我尝试反序列化响应时,我会遇到大量错误

如何反序列化此有效负载?

7|0|7|http://localhost:8080/testproject/
|29F4EA1240F157649C12466F01F46F60|
com.test.client.GreetingService|greetServer|java.lang.String|
myInput1|myInput2|1|2|3|4|2|5|5|6|7|
我搜索了一整天,关注了一些类似这样的博客:

我不确定如何在代码方面将它们序列化到我自己的新服务对象中

static WebClient webClient = WebClient.create();

public static void main(String[] args) {

    Mono<String> body = Mono.just("7|0|7|http://localhost:8080/testproject/|29F4EA1240F157649C12466F01F46F60|com.test.client.GreetingService|greetServer|java.lang.String|myInput1|myInput2|1|2|3|4|2|5|5|6|7|");

    Mono<String> response = webClient.post()
            .uri("http://localhost:8080/testproject/")
            .header("Content-Type", "text/x-gwt-rpc;charset=UTF-8")
            .header("X-GWT-Module-Base", "http://localhost:8080/testproject/")
            .header("X-GWT-Permutation", "29F4EA1240F157649C12466F01F46F60")
            .cookie("JSESSIONID", "2BCEBF12GE2C3A0335F5012812A73638")
            .body(body, String.class)
            .retrieve()
            .bodyToMono(String.class);

    String unBlocked = response.block();

    System.out.println(unBlocked);
    //OK[1,1,["java.lang.Integer/3438228391"],0,2]

    try {
    ServerSerializationStreamReader streamReader = new ServerSerializationStreamReader(
        Thread.currentThread().getContextClassLoader(), null);
        streamReader.prepareToRead(unBlocked);
        System.out.println(streamReader.readObject());
    } catch ( Exception e) {
        e.printStackTrace();
    }
}
static WebClient WebClient=WebClient.create();
公共静态void main(字符串[]args){
单体=Mono.just(“7 | 0 | 7|http://localhost:8080/testproject/|29F4EA1240F157649C12466F01F46F60 | com.test.client.GreetingService | greetServer | java.lang.String | myInput1 | myInput2 | 1 | 2 | 3 | 4 | 2 | 5 | 6 | 7 |);
Mono response=webClient.post()
.uri(“http://localhost:8080/testproject/")
.header(“内容类型”,“文本/x-gwt-rpc;字符集=UTF-8”)
.标题(“X-GWT-Module-Base”http://localhost:8080/testproject/")
.标题(“X-GWT-Permutation”,“29F4EA1240F157649C12466F01F46F60”)
.cookie(“JSSessionID”、“2BCEBF12GE2C3A0335F5012812A73638”)
.body(body,String.class)
.retrieve()
.bodyToMono(String.class);
String unBlocked=response.block();
System.out.println(未阻塞);
//OK[1,1,[“java.lang.Integer/3438228391”],0,2]
试一试{
ServerSerializationStreamReader streamReader=新的ServerSerializationStreamReader(
Thread.currentThread().getContextClassLoader(),null);
streamReader.prepareToRead(未阻止);
System.out.println(streamReader.readObject());
}捕获(例外e){
e、 printStackTrace();
}
}
错误: com.google.gwt.user.client.rpc.CompatibileMoteServiceException:此应用程序已过期,请单击浏览器上的“刷新”按钮。(接收到格式错误或旧的RPC消息-版本应介于5和7之间)

由于RCP消息格式错误,我尝试了GWT的每个版本。
而且,我试着把它粘在一根绳子上,我确信这是失败的

您正在尝试使用解码客户端请求的代码解码服务器响应。目前,出于历史原因,它们使用不同的格式—注意响应如何以“//OK”开头,但请求的开头是version/flags/stringcount“7 | 0 | 7”

至少在一小部分情况下,这是因为当客户机调用服务器时,它需要描述它所说的版本以及服务器应该在哪里找到列出客户机希望序列化的类集的文件。当服务器响应时,因为客户机已经告诉它可以序列化的类型,所以它不需要再次告诉客户机同样的事情


阅读
com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader类及其文档将显示响应格式以及如何将其解码为对象。据我所知,目前还没有服务器端代码用于完成这项工作,但可能编写起来难度相当小,只是需要一些持久性。

有效负载只是一个
字符串吗?如果是,并且值始终按该顺序排列,则可以在管道上使用
split
方法。然后,您将拥有一个
字符串[]
,其中包含可以循环使用的值,并可以对其执行任何操作。它具有相当复杂的对象。我可以拿出模型并在我的项目中使用它们。为简单起见,是否可以在此基础上创建一个toString,并像打印JsonObject或类似对象一样打印所有值?一旦我能把我的头绕过去,我就可以开始分崩离析。我的意思是,任何事情都是可能的。然而,我不明白你是如何获得“有效载荷”的。您是否可以更新您的帖子以包含获取“有效负载”的代码?如果它真的只是一个
字符串
,你可以很容易地将它转换成JSON。你能分享你得到的错误和你迄今为止编写的代码吗?您正在尝试的是非常可行的,但确实需要一些设置,您可以在RemoteServiceServlet中看到GWT是这样做的。@FrancisBartkowiak&Colin我已经用附加信息更新了文章。谢谢,ClientSerializationStreamReader看起来是一个很好的开始。