Java 在服务器端扩展序列化对象时发生强制转换错误
我试图通过套接字将一个序列化的Java对象从客户端发送到服务器,但是服务器端出现了一个强制转换错误,我不知道为什么。 下面是正在序列化的类。我使用的是Eclipse,这个类在客户端和 包和服务器包Java 在服务器端扩展序列化对象时发生强制转换错误,java,sockets,serialization,Java,Sockets,Serialization,我试图通过套接字将一个序列化的Java对象从客户端发送到服务器,但是服务器端出现了一个强制转换错误,我不知道为什么。 下面是正在序列化的类。我使用的是Eclipse,这个类在客户端和 包和服务器包 package client; //it is "package server;" on server side import java.io.Serializable; public class Simple implements Serializable { public String
package client; //it is "package server;" on server side
import java.io.Serializable;
public class Simple implements Serializable {
public String msg;
public Simple(){
msg = "simple";
}
}
在客户端,我做到了:
Simple obj = new Simple();
Socket socket = new Socket(hostname, portNum);
ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream());
objOut.writeObject(obj);
objOut.flush();
objOut.close();
//already accepted clientSocket
ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream());
Simple anObj = (Simple) objIn.readObject();
System.out.println("from server: " + anObj.msg);
objIn.close();
clientSocket.close();
在服务器端,我做到了:
Simple obj = new Simple();
Socket socket = new Socket(hostname, portNum);
ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream());
objOut.writeObject(obj);
objOut.flush();
objOut.close();
//already accepted clientSocket
ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream());
Simple anObj = (Simple) objIn.readObject();
System.out.println("from server: " + anObj.msg);
objIn.close();
clientSocket.close();
但是,我得到了一个错误:
Exception in thread "main" java.lang.ClassCastException: client.Simple cannot be cast to server.Simple at server.Server.main
我在一个包中尝试了与服务器和客户端类似的方法,序列化和膨胀都有效。如果您能帮我找出它在这里不起作用的原因,我将不胜感激。//这是package server;在服务器端
你有两个不同的简单类吗?我的意思是,您是否在两个不同的包下声明了两次简单类,这样它们就不同了,不能是cat。我只有一节课。您可以使用它。//它是包服务器;在服务器端
你有两个不同的简单类吗?我的意思是,您是否在两个不同的包下声明了两次简单类,这样它们就不同了,不能是cat。我只有一节课。你可以用这个。简单地说;为了避免不同名称空间中的两个类型发生冲突,包名称是类型名称的一部分 发生的情况是,客户端序列化了client.Simple,服务器也将其反序列化为client.Simple。然后将其强制转换到server.Simple,这是一种完全不同的类型 它可以通过做来表现
ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream());
Object anObj = objIn.readObject();
System.out.println(anObj); // Output "client.Simple@39617189"
obj = (server.Simple)anObj; // Throws ClassCastException
代码显示服务器知道反序列化对象的类型是client.Simple,并且它不能将其强制转换到单独的类型server.Simple。简单地说;为了避免不同名称空间中的两个类型发生冲突,包名称是类型名称的一部分 发生的情况是,客户端序列化了client.Simple,服务器也将其反序列化为client.Simple。然后将其强制转换到server.Simple,这是一种完全不同的类型 它可以通过做来表现
ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream());
Object anObj = objIn.readObject();
System.out.println(anObj); // Output "client.Simple@39617189"
obj = (server.Simple)anObj; // Throws ClassCastException
代码显示服务器知道反序列化对象的类型是client.Simple,并且它不能将其强制转换为单独的类型server.Simple
序列化和发送的是类client.simple
但是在接收到的对象上,您正试图将其类型转换到另一个类服务器。simple
这是两个不同的类,因此您将得到异常。
确保服务器可以访问用于序列化的同一类client.simple。
序列化和发送的是类client.simple
但是在接收到的对象上,您正试图将其类型转换到另一个类服务器。simple
这是两个不同的类,因此您将得到异常。
确保服务器可以访问用于序列化的同一类client.simple。