我试图通过套接字将一个序列化的Java对象从客户端发送到服务器,但是在服务器端有一个强制转换错误,我无法弄清楚原因。 被序列化的类如下。 (我正在使用Eclipse,这个类同时在客户端 包和服务器包。)
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();
然而,我收到了错误:
Exception in thread "main" java.lang.ClassCastException: client.Simple cannot be cast to server.Simple at server.Server.main
我在一个软件包中尝试过与Server和Client类似的东西,序列化和通货膨胀都有效。如果你能帮助我找出它在这里不起作用的原因,我将非常感激。
答案 0 :(得分:0)
//是“包服务器”;在服务器端 那么你有两个不同的简单类吗?我的意思是,你是否在两个不同的包装下两次宣布“简单”类,所以它们是不同的,不能是猫。只有一节课。您可以使用此tutorial。
答案 1 :(得分:0)
简单地说;为避免不同命名空间中的两种类型发生冲突,包名称是类型名称的一部分。
客户端序列化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
。< / p>
答案 2 :(得分:0)
class client.simple
class server.simple
client.simple
。