【问题标题】:Google App Engine - Change package for a persistent classGoogle App Engine - 持久类的更改包
【发布时间】:2011-05-08 02:29:01
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 反序列化遇到什么“问题”?请堆栈跟踪!

标签: java google-app-engine gwt google-cloud-datastore


【解决方案1】:

这就是我将 my.package.Clazz 移动到 my.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 和 my.new.package.Clazz.

  • 剩下要做的就是再次从数据存储中读取 TempClazz 并将每个复制到一个 Clazz 实体中。

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

【讨论】:

  • 为什么不直接复制新包中的定义,直接从旧包复制实体到新包?
  • @Nick,你试过吗?如果您的建议有效,我不明白为什么 OP 首先使用新类反序列化现有实体有困难。文档指出实体键是从类的简单名称派生的,因此我认为尝试持久化/检索具有相同类名的不同实体是一种伤害。参照。 code.google.com/intl/de-DE/appengine/docs/java/datastore/jdo/…
  • 我正在对此进行更多调查,并将返回结果。我看到在某些情况下我在反序列化方面有问题,而在其他情况下我没有。例如,我有一个持久的 ClassA,它有一个 ClassB 类型的持久字段,它还有一个 ClassC 类型的持久字段。如果我将 C 类从 com.dfb.client.ClassC -> com.dfb.shared.ClassC 移动,我会收到一个反序列化错误,提示“找不到 com.dfb.client.ClassC”(或类似内容)。让我进行彻底的分析并报告确切的发现。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 2013-04-17
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多