动态主机页面的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对象,因此可能有一种简单的方法...
谢谢
您可以尝试重用GWT的com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter,将POJO对象序列化为字符串并将其放入动态主机页面。
然后你可以使用com.seanchenxi.gwt.storage.client.serializer.StorageSerializer来进行反序列化。
要获得StorageSerializer的实例,您应该使用GWT.create(StorageSerializer.class);
所以thx你@ 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 ( Serializable是不够的)
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();
}
}
}
链接地址: http://www.djcxy.com/p/51077.html