2011-05-08 68 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