【问题标题】:GWT RPC serialization for Dynamic Host Page动态主机页面的 GWT RPC 序列化
【发布时间】:2025-11-22 23:45:01
【问题描述】:

我在我的 GWT 项目中实现了一个Dynamic Host Page (http://www.gwtproject.org/articles/dynamic_host_page.html) 来直接在其中传递我的User POJO 对象。

我是用 AutoBean (https://code.google.com/p/google-web-toolkit/wiki/AutoBean) 做的,所以我必须声明和实现 接口

但我发现这种方式有点过于冗长了。

还有其他方法吗?我的意思是 GWT RPC 在没有 Interfaces 的情况下进行序列化,所以我可以使用它吗?

另外一点;我已经使用了 gwt-storage lib (https://github.com/seanchenxi/gwt-storage),它使用 GWT RPC 机制 在浏览器中存储 Java POJO 对象,所以可能有一个简单的方法。 .

谢谢

【问题讨论】:

    标签: java gwt serialization pojo gwt-rpc


    【解决方案1】:

    您可以尝试重用 GWT 的 com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter 将您的 POJO 对象序列化为字符串并将其放入您的动态主机页面。

    然后你可以使用 com.seanchenxi.gwt.storage.client.serializer.StorageSerializer 进行反序列化。

    要获取 StorageSerializer 的实例,您应该使用 GWT.create(StorageSerializer.class);

    【讨论】:

      【解决方案2】:

      谢谢@xi-chen 和@richard-wallis

      部分解决方案已在 gwt-storage github repo (https://github.com/seanchenxi/gwt-storage/issues/8#issuecomment-68443910)

      上进行了讨论

      所以使用 GWT RPC 机制 + gwt-storage 完全有可能:

      index.jsp

      <%@page import="com.google.gson.Gson"%>
      <%@page import="com.learnkeeper.server.ServiceImpl"%>
      <%@page import="com.google.gwt.user.server.rpc.RPC"%>
      <%@page import="com.learnkeeper.shared.entities.User"%>
      <!DOCTYPE html>
      <html>
      
      <head>
      <meta charset="utf-8">
      <%
        Object user = request.getSession().getAttribute("user");
        String serialized_user = new Gson().toJson(RPC.encodeResponseForSuccess(ServiceImpl.class.getMethod("getUser"), user).substring("//OK".length()));
      %>
      <script type="text/javascript">var serialized_user=<%=serialized_user%>;</script>
      </head>
      <body>
      

      请注意,您必须删除 RPC.encodeResponseForSuccess 结果开头的 //OK 子字符串。

      User.java

      public class User implements IsSerializable {
      }
      

      注意你必须实现 IsSerializableSerializable 是不够的)

      HostPageUtils.java

      public class HostPageUtils {
        private static final native String getSerializedUser() /*-{
              return $wnd.serialized_user;
        }-*/;
      
        public static User getUser() {
          final String serializedUser = getSerializedUser();
          StorageSerializer storageSerializer = GWT.create(StorageSerializer.class);
          try {
            return storageSerializer.deserialize(User.class, serializedUser);
          } catch (Exception e) {
            throw new RuntimeException();
          }
        }
      }
      

      【讨论】: