我刚开始学习Google Web Toolkit并完成了Stock Watcher教程应用程序的编写。
我的想法是否正确如果想要坚持业务对象(如股票)使用JDO并将其来回传送到客户端通过RPC,然后必须为该对象创建两个单独的类:一个具有JDO注释用于在服务器上持久保存,另一个用于可序列化并通过RPC使用?
我注意到Stock Watcher有不同的类,我可以理解为什么:
我只是想确保我正确理解这一点。我不想创建我想要在RPC 上使用的所有业务对象类的两个版本,如果我不需要。
答案 0 :(得分:4)
简短的回答是:您不需要创建重复的类。
我建议您在gwt-contributors列表中查看以下google论坛讨论:
这是一段有趣的摘录:
如果这是你感兴趣的全部,我 描述了一种制作GAE和GAE的方法 GWT-RPC协同工作“走出困境 框。“只需将您的实体声明为: @PersistenceCapable(identityType = IdentityType.APPLICATION,可拆卸 =“false”)公共类MyPojo实现Serializable {}
一切都会奏效,但你会 必须手动处理 发送对象时重新附加 从客户端返回服务器。
您可以使用此选项,而不需要镜像(DTO)类。 您还可以尝试gilead(以前的hibernate4gwt),它会处理序列化增强对象问题中的一些细节。
答案 1 :(得分:2)
您的评估是正确的。 JDO用自己的实现替换了Collections的实例,以便在对象图改变时嗅探,我想。 GWT编译器不知道这些实现,因此无法对它们进行序列化。这通常发生在由其他GWT兼容类型组成的类中,但是使用JDO注释,特别是如果某些对象属性是集合。
有关详细说明和解决方法,请查看有关该主题的这篇颇具影响力的文章:http://timepedia.blogspot.com/2009/04/google-appengine-and-gwt-now-marriage.html
答案 2 :(得分:2)
我终于找到了解决方案。根本不要改变你的对象,但对于列表这样做:
List<YourCustomObject> secureList=(List<YourCustomObject>)pm.newQuery(query).execute();
return new ArrayList<YourCustomObject>(secureList);
实际问题不在于序列化对象......问题在于序列化由Google实现的Collection类,并且不允许序列化。
答案 3 :(得分:1)
您不必创建两个版本的域模型。
以下是两个提示:
使用String编码的密钥,而不是Appengine Key类。
pojo = pm.detachCopy(pojo)
...将删除所有JDO增强功能。
答案 4 :(得分:0)
您根本不必创建单独的实例,事实上您最好不要这样做。无论如何,您的JDO对象应该是普通的POJO,并且永远不应该包含业务逻辑。这适用于您的业务层,而不是您自己的持久对象。
您需要做的就是包含您正在使用的注释的来源,GWT应该很好地编译您的课程。另外,你想避免使用GWT无法编译的库(比如使用反射的东西等),但在我所做的所有项目中,这从来都不是问题。
答案 5 :(得分:0)
我认为通过GWT发送对象的更好格式是通过JSON。在这种情况下,从服务器发送一个JSON字符串,然后必须在客户端解析。优点是在浏览器中呈现的最终Javascript具有较小的大小。从而导致页面加载速度更快。
其次,要通过GWT发送对象,对象应该是可序列化的。所有对象可能不是这种情况
第三,GWT内置了处理JSON的功能......所以客户端没有问题