动态主机页面的GWT RPC序列化

时间:2014-12-31 12:05:15

标签: java gwt serialization pojo gwt-rpc

我在GWT项目中实施了动态主机页http://www.gwtproject.org/articles/dynamic_host_page.html),直接将用户 POJO对象传递给它。

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

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

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

另一点;我已经使用 gwt-storage lib https://github.com/seanchenxi/gwt-storage)使用 GWT RPC mechanisim 在浏览器中存储Java POJO对象,因此可能有一种简单的方法...

THX

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

所以你@ 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 {
}
  

请注意,您必须实施 IsSerializable 可序列化是不够的)

<强> 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();
    }
  }
}