Java 如何在客户端和服务器之间共享类实体?

Java 如何在客户端和服务器之间共享类实体?,java,eclipse,Java,Eclipse,我有两个项目: 1) 客户端-安卓 2) 服务器-谷歌应用程序引擎 在服务器端,我有一个名为Profile的类实体 我将它包含在客户端和服务器项目的buildpath中。 我正在客户端创建配置文件的新实例,将其发送到服务器并存储在JPA DB中。 在服务器端 在特定时间之后,我从服务器向量将服务器中的所有客户端发送给用户 问题是: 当我添加配置文件的构建路径时,我得到: The project was not built since its build path is incomplete. C

我有两个项目:

1) 客户端-安卓
2) 服务器-谷歌应用程序引擎

在服务器端,我有一个名为Profile的类实体
我将它包含在客户端和服务器项目的buildpath中。 我正在客户端创建配置文件的新实例,将其发送到服务器并存储在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解决这个问题有什么老办法吗?如果没有的话,我将非常感谢优秀教程附带的其他解决方案。

在我的例子中,我们有很多hibernate对象。由于各种原因,无法将这些对象发送到客户端。你们在同一条船上

在我的项目中,我创建了单独的简单bean,用于在服务器和客户端之间传输数据。然后还有代码用于从内部对象转换到这些外部可移植、可序列化的对象,然后再转换回来。我们曾经使用RMI来回发送这些对象。现在我们使用黑森语


您可以将这些类放在一个单独的项目中,这样您就可以让客户端和服务器都将它们放在它们的类路径中。

在我的例子中,我们有很多hibernate对象。由于各种原因,无法将这些对象发送到客户端。你们在同一条船上

在我的项目中,我创建了单独的简单bean,用于在服务器和客户端之间传输数据。然后还有代码用于从内部对象转换到这些外部可移植、可序列化的对象,然后再转换回来。我们曾经使用RMI来回发送这些对象。现在我们使用黑森语


您可以将这些类放在一个单独的项目中,这样客户机和服务器都可以将它们放在它们的类路径中。

您需要将实体类放在jar中,并将相同版本的jar分发给服务器和客户机。 在反序列化对象时,JVM将使用serialVersionUID检查它们是否属于同一版本的类


如果在任何实体中声明了

,则需要将实体类放在一个jar中,并将相同版本的jar分发给服务器和客户机。 在反序列化对象时,JVM将使用serialVersionUID检查它们是否属于同一版本的类


如果在任何实体中声明

,我会使用非二进制格式来传输数据,例如JSON或XML,那就更好了。尝试使用二进制序列化将导致头痛,即使您解决了构建路径问题,即使您使用了更简单的“传输”bean对象。例如,当您想要备份客户端或服务器时,您必须使它们完全同步(JAR),如果不进行大量额外工作,就无法让旧客户端与新服务器通信(反之亦然)。但通过使用JSON或XML,客户机和服务器可以在某种程度上独立发展


在Android上使用XML或JSON非常简单,Java EE(服务器)也是如此。

我将使用非二进制格式来传输数据,如JSON或XML。尝试使用二进制序列化将导致头痛,即使您解决了构建路径问题,即使您使用了更简单的“传输”bean对象。例如,当您想要备份客户端或服务器时,您必须使它们完全同步(JAR),如果不进行大量额外工作,就无法让旧客户端与新服务器通信(反之亦然)。但通过使用JSON或XML,客户机和服务器可以在某种程度上独立发展


在Android上使用XML或JSON非常简单,Java EE(服务器)也是如此。

如何来回发送数据对象?你在用RMI吗?没有。我正在序列化对象。如何来回发送数据对象?你在用RMI吗?没有。我正在序列化对象。如果这是一个新的应用程序,你实际上不必生成serialVersionUID。只需将其设置为1L。如果您已经将此部署到客户端,并且需要与客户端保持兼容,则需要运行serialver以获取此编号并将其设置为此编号。感谢您的评论,我将“generate”替换为“declare”,因为其生成路径不完整,所以项目未生成。找不到javax.jdo.spi.PersistenceCapable的类文件。无法解析javax.jdo.spi.PersistenceCapable类型。它是从required.class文件中间接引用的。您必须提供jdo2-api-2.3-eb.jar,就像您已经提供的一样,并在服务器和客户端中随实体jar一起交付此jar。如果这是一个新应用,您实际上不必生成serialVersionUID。只需将其设置为1L。如果您已经将此部署到客户端,并且需要与客户端保持兼容,则需要运行serialver以获取此编号并将其设置为此编号。感谢您的评论,我将“generate”替换为“declare”,因为其生成路径不完整,所以项目未生成。找不到javax.jdo.spi.PersistenceCapable的类文件。无法解析javax.jdo.spi.PersistenceCapable类型。它是从required.class文件中间接引用的。您必须提供jdo2-api-2.3-eb.jar,就像您已经提供的那样,并在服务器和客户端中随实体jar一起交付此jar