为什么不将 类 序列化的定义放在共享包中导致“ClassNotFoundException”?
Why not putting the definition of classes serialization in a shared package results in a `ClassNotFoundException`?
我有一个客户端和服务器,它们使用序列化将 Shape
的数组从服务器发送到客户端。我已经编写了所有代码,就在客户端程序和服务器程序之间创建共享包而言,它们没有任何错误。但是,当我创建两个单独的项目时,如果我创建的项目 Shape.java
与另一个项目具有相同的内容,但这次当我将客户端连接到服务器时,它会给我一个 ClassNotFoundException
。
为什么当我将 Shape.java
放入共享包时它没有报错,但是当我创建一个副本并将其粘贴到服务器的程序时,它会给我 ClassNotFoundException
?我真的需要它,因为我想将我的代码发送给我的朋友,他有一个单独的项目使用这个序列化对象。
why should I create [the class] in the same package?
因为Shape
是不是class的名字,只是其中的一部分。 Java 通过全名识别 classes,其中包括包。[=16=]
如果您在服务器上将 Shape
定义为 com.myserver.Shape
,在客户端将其定义为 com.myclient.Shape
,JVM 会正确地将这两个 class 视为不相关。
一种常见的方法是为您的数据交换对象制作一个特殊的包,例如com.shared.dto.Shape
,并在通信双方使用。
如果您需要与其他人共享您的项目,请为您的 DTO 制作一个单独的 jar,并为客户端库制作另一个 jar。使用客户端库和 DTO jar 构建客户端代码。这将确保客户端能够与针对同一 DTO jar 构建的服务器进行通信。
我有一个客户端和服务器,它们使用序列化将 Shape
的数组从服务器发送到客户端。我已经编写了所有代码,就在客户端程序和服务器程序之间创建共享包而言,它们没有任何错误。但是,当我创建两个单独的项目时,如果我创建的项目 Shape.java
与另一个项目具有相同的内容,但这次当我将客户端连接到服务器时,它会给我一个 ClassNotFoundException
。
为什么当我将 Shape.java
放入共享包时它没有报错,但是当我创建一个副本并将其粘贴到服务器的程序时,它会给我 ClassNotFoundException
?我真的需要它,因为我想将我的代码发送给我的朋友,他有一个单独的项目使用这个序列化对象。
why should I create [the class] in the same package?
因为Shape
是不是class的名字,只是其中的一部分。 Java 通过全名识别 classes,其中包括包。[=16=]
如果您在服务器上将 Shape
定义为 com.myserver.Shape
,在客户端将其定义为 com.myclient.Shape
,JVM 会正确地将这两个 class 视为不相关。
一种常见的方法是为您的数据交换对象制作一个特殊的包,例如com.shared.dto.Shape
,并在通信双方使用。
如果您需要与其他人共享您的项目,请为您的 DTO 制作一个单独的 jar,并为客户端库制作另一个 jar。使用客户端库和 DTO jar 构建客户端代码。这将确保客户端能够与针对同一 DTO jar 构建的服务器进行通信。