一种通过GWT中的RPC机制对字符串/对象进行marshall/unmarchall的方法,无需使用实际的RPC servlet

一种通过GWT中的RPC机制对字符串/对象进行marshall/unmarchall的方法,无需使用实际的RPC servlet,gwt,gwt-rpc,Gwt,Gwt Rpc,我的大多数应用程序都使用GWT-RPC在servlet和客户端之间进行通信。然而,一些类需要通过使用如下各种参数“字符串粉碎”URL手动构建get请求 public static String getTemplateImage(String templateInstanceId, PageImage pageImage) { return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH

我的大多数应用程序都使用GWT-RPC在servlet和客户端之间进行通信。然而,一些类需要通过使用如下各种参数“字符串粉碎”URL手动构建get请求

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) {
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH
            + "?templateInstanceId=" + templateInstanceId
            + "&fileName=" + pageImage.getImageId()
            + "&isBackground=false"
            + "&cropX=" + pageImage.getCropX()
            + "&cropY=" + pageImage.getCropY()
            + "&cropWidth=" + pageImage.getCropWidth()
            + "&cropHeight=" + pageImage.getCropHeight();
}
我想知道,有没有一种方法可以借助GWT非常棒的GWT-RPC对象封送器来实现这一点

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) {
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH
            + "?templateInstanceId=" + templateInstanceId
        + "&pageImage=" + SomeGWTClass.toRpcString(pageImage)
       ;
}
然后在servlet端执行以下操作

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final String templateInstanceId = req.getParameter("templateInstanceId");
        final String strPageImage= req.getParameter("pageImage");
        **final PageImage pageImage = SomeGWTClass.unmarshallString(PageImage.class,strPageImage);**    
}

我不确定以这种方式使用GWT RPC是否是一个好主意。位于
com.google.GWT.user.client.rpc
com.google.GWT.server.rpc
包中的GWT序列化类是GWT的内部类,您不应该从应用程序代码中调用它(如果您正在编写一个通用框架,并愿意在新版本的GWT发布时对其进行调整,这没关系,可能会对这些类的API进行突破性的更改)

在GWT中很难获得这种通用功能的原因是它缺乏Java的反射支持。不过,您可以使用JavaScript来恢复这种灵活性。例如,如果您可以将PageImage类转换为GWT覆盖类型,则可以使用
new JSONObject(PageImage).toString()
将对象封送为json。像XStream这样的json库可以在服务器上将此字符串转换回Java对象


有关GWT覆盖类型技术的详细信息,请参见此部分。

基本上可以这样做,但实现起来相当困难。服务器部分非常简单,问题将出现在客户端

由于GWT缺少反射,它在编译时生成类似FieldSerializer的类。对于通过GWT RPC服务传递的任何类,GWT将创建一个FieldSerializer,它知道如何序列化/反序列化对象

因此,为了使用这个功能,您需要创建某种框架,在这种框架中,您将指示您要序列化/反序列化某个对象,定义自定义生成器,它将生成您需要的所有内容,等等

但也有一个简单的方法(但这是一个非常肮脏的黑客,我不建议使用它,但谁在乎=)。添加要序列化到某个GWT-RPC服务的类,然后使用-gen选项运行编译器。它会将所有这些FieldSerializer写入磁盘。然后,您可以简单地将它们包含在应用程序中并使用它们。但每次更改序列化的类时,您都需要重新生成它们。这是一个相当复杂的操作,但我们使用为了调试的目的,它被修改了几次

因此,选择权在你,我个人建议你忘掉GWT-RPC mecahnism,使用overlay type+JSON parse/stringify