序列化GWT值对象并在服务器端反序列化它

时间:2011-06-01 16:40:50

标签: gwt serialization

我有一个需要支持下载大型.csv文件的GWT应用程序。这是通过ReportServlet完成的,它设置了浏览器打开下载对话框和启动电子表格应用程序所需的正确内容类型和其他标题。

由于报告有多个过滤参数,我需要以某种方式将它们传递给服务器。我不能使用AJAX回调,因为在这种情况下浏览器不会弹出下载对话框。 目前我这样做是通过为每个参数创建一个带有隐藏字段的表单,并在服务器端手动解析它们。

对于值对象具有序列化程序,将序列化值放在一个表单参数中,在服务器上反序列化并使用它,就像我们在常规RPC中一样,这将是一个更优雅的解决方案调用

起初我试图在GWT代码库中搜索一些串行器/解串器api,但我找不到任何。之后我搜索了JSON序列化程序,但是没有它们有简单的API或支持GWT。这两个JSON序列化器: http://code.google.com/p/gwtprojsonserializer/http://sites.google.com/site/gson/ 可能很棒,但gwtprojson将Dates序列化为时间戳,并将类名放在序列化字符串中,而gson作为dateformat字符串,序列化字符串中没有类名。

所以最后要点

有人能建议在GWT和java中都能运行的对象序列化器/反序列化器吗?不一定是JSON,任何其他格式都可以 或
有没有人经常使用上面提到的序列化程序库,或者使用其他可以在GWT中序列化并在Java中反序列化的库?

提前致谢! pentike

2 个答案:

答案 0 :(得分:0)

您可以通过OverlayTypes:Json <-> Java serialization that works with GWT

在GWT中生成JSON

OTOH,如何分两步完成:

  1. 使用RPC将任意过滤器对象发送到服务器。服务器保存此对象(数据库/ memcache / session取决于您的需要)并返回标识此过滤器对象的唯一过滤器ID。

  2. 以文件管理员ID作为唯一参数发出文件下载请求。服务器查找文件管理器对象,准备CSV并将其发回。

  3. 这样做的好处是:

    • 没有序列化/反序列化的痛苦。
    • 如果CSV生成需要很长时间,您可以在初始RPC生成时生成CSV,并在RPC完成时开始下载。与此同时,您可以显示一个很好的对话框/通知。
    • 过滤ID可以是一次性/时间限制/ IP锁定,因此用户无法记录URL并将其发送给其他人。

答案 1 :(得分:0)

我为GSon编写了一个自定义反序列化程序。这很简单,所以它适用于gwtprojsonserializer。

    public class MyDateAdapter implements JsonDeserializer {

  /*
   * (non-Javadoc)
   * 
   * @see com.google.gson.JsonDeserializer#deserialize(com.google.gson.JsonElement,
   * java.lang.reflect.Type, com.google.gson.JsonDeserializationContext)
   */
  @Override
  public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext ctx)
                                                                                             throws JsonParseException {
    return new Date(jsonElement.getAsJsonPrimitive().getAsLong());
  }

}

我们需要注册我们的自定义反序列化器:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class, new MyDateAdapter());
    Gson gson = gsonBuilder.create();