2011-05-08 72 views
2

我的GWT应用程序部署在Google App Engine for Java上。我在应用程序引擎数据存储中持久保存了一个类的实例。现在我想将这个类移动到不同的包中,但是它会导致反序列化现有对象时出现问题。Google App Engine - 更改持久类的包

那么,有没有一种方法可以将课程移到一个新的包中?如果这有助于我实现目标,我不介意更新现有的对象。

谢谢。

+0

你有什么问题反序列化?请Stacktrace! – 2011-05-10 17:30:35

回答

2

这是我如何将my.package.Clazz移动到我的。 new .package.Clazz。其基本思想是通过第三个“临时”类(在这种情况下TempClazz)做迁移:

  • 创建新类my.package.TempClazz(不要简单地命名clazz所)

  • 创建一个帮助方法,它将从数据存储中读取所有现有的Clazz实体,然后将数据复制到新的TempClazz实例中并将TempClazz实体存储在数据存储中。

  • 现在部署到GAE并运行辅助方法将您的Clazz实体复制到TempClazz实体。

  • 如果工作。删除Clazz实体。

  • 接下来,基本上重复这个过程,除了这次你实际上将my.package.Clazz重构到新的包my中。 new .package.Clazz。所以在这一点上,你将有两个类:my.package.TempClazz和我的。 new .package.Clazz。

  • 所有剩下要做的事情就是再次读取数据存储区中的TempClazz并将其复制到Clazz实体中。

很有参与性。也许有人知道更简单的方法?

+0

为什么不直接复制新包中的定义,并将实体直接从旧的复制到新的? – 2011-05-09 23:23:40

+1

@尼克,你试过了吗?如果您的建议有效,我不明白为什么OP首先使用新类反序列化现有实体。该文档指出,实体键是从类的简单名称派生的,因此我假设试图持续/检索具有相同类名的不同实体是一袋伤害。参看http://code.google.com/intl/de-DE/appengine/docs/java/datastore/jdo/dataclasses.html#Class_and_Field_Annotations – Stefan 2011-05-10 08:46:41

+0

我正在对此进行更多调查,并会找回结果。我看到在某些情况下,我在反序列化过程中遇到了问题,在另一些情况下我没有。例如,我有一个持久ClassA,它有一个类型为ClassB的持久字段,它还有一个类型为ClassC的持久字段。如果我从com.dfb.client.ClassC - > com.dfb.shared.ClassC移动类C,则会出现说“com.dfb.client.ClassC”未找到(或类似内容)的反序列化错误。让我进行彻底的分析并报告确切的发现。谢谢你的帮助。 – DFB 2011-05-11 02:57:54