2012-04-23 125 views
1

我有2個項目:如何在客戶端和服務器之間共享類實體?

1)客戶端 - Android電子
2)服務器 - 谷歌應用程序引擎

在服務器端我有實體類被稱爲檔案
我將它包含在客戶端的構建路徑中服務器項目。 我正在客戶端中創建配置文件的新實例,將其發送到服務器並將其存儲在JPA DB中。
在服務器端 經過特定時間我從服務器向量發送服務器中的所有客戶端到用戶。

的問題是:

當我加入的個人資料,我得到的構建路徑:

The project was not built since its build path is incomplete. Cannot find the class file for javax.jdo.spi.PersistenceCapable. 
The type javax.jdo.spi.PersistenceCapable cannot be resolved. It is indirectly referenced from required .class files 

所以在客戶端,我加入jdo2-api-2.3-eb.jar。 並且問題似乎消失。 但是,當時我送的個人資料矢量形式的服務器到客戶端,我得到運行時:

java.io.InvalidClassException: javax.jdo.identity.LongIdentity; Incompatible class (SUID): javax.jdo.identity.LongIdentity: static final long serialVersionUID =2472141538875317527L; but expected javax.jdo.identity.LongIdentity: static final long serialVersionUID =2940818939440220368L; 

,我相信由jdo2-api-2.3-eb.jar我添加引起的。

所以我問如何正確地做到這一點?我明白,Maven或Ant可以解決這個問題,但看起來很混亂。通過使用基本的Eclipse來解決這個問題,有沒有舊的方法?如果不是,我將不勝感激其他解決方案,與良好的教程。

+0

你是如何來回傳送數據對象的?你在使用RMI嗎? – 2012-04-23 12:44:23

+0

沒有RMI。我正在序列化對象。 – Rami 2012-04-23 12:58:30

回答

1

我會用非二進制格式用於傳輸檢查它們是否屬於使用的serialVersionUID

更好之類的相同版本數據,如JSON或XML。嘗試使用二進制序列化會導致頭痛,即使您已經理清了構建路徑問題,即使您使用更簡單的「傳輸」bean對象。例如,當你想要客戶端或者服務器時,你必須保持它們完全同步(JAR),你不能讓一箇舊客戶端與一個新服務器通信(反之亦然),而不需要很多加班。但通過使用JSON或XML,客戶端和服務器可以獨立發展。

在Android上使用XML或JSON非常簡單,對於Java EE(服務器)也是如此。

+0

可能這是最好的方法解決我的問題,謝謝 – Rami 2012-04-24 08:54:29

0

在我的情況下,我們有很多的hibernate對象。出於各種原因,您無法將這些對象發送給客戶端。你在同一條船上。

在我的項目中,我創建了用於在服務器和客戶端之間傳輸數據的單獨的簡單bean。還有代碼可以將內部對象轉換爲外部便攜式,可序列化的對象並返回。我們過去使用RMI來回發送這些對象。現在我們使用Hessian。

你會把這些類放在一個單獨的項目中,這樣你就可以讓客戶端和服務器都在他們的類路徑中。

0

您需要將實體類放入jar中,並將相同版本的jar分發給服務器和客戶端。 反序列化對象的JVM會如果任何實體聲明的serialVersionUID

+0

如果這是一個新的應用程序,您實際上不必生成serialVersionUID。只需將其設置爲1L。如果您已經將其部署到客戶端,並且需要與它們保持兼容,那麼您需要運行serialver以獲取此號碼並將其設置爲該號碼。 – 2012-04-23 13:19:59

+0

感謝您的評論,我用「聲明」取代了「生成」 – Teg 2012-04-23 13:29:01

+0

我仍然得到:該項目沒有構建,因爲它的構建路徑不完整。找不到javax.jdo.spi.PersistenceCapable的類文件。 無法解析類型javax.jdo.spi.PersistenceCapable。它是從所需的.class文件中間接引用的 – Rami 2012-04-23 13:56:48

相關問題