在服务器端膨胀序列化对象时抛出错误

时间:2012-02-19 06:33:14

标签: 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 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类似的东西,序列化和通货膨胀都有效。如果你能帮助我找出它在这里不起作用的原因,我将非常感激。

3 个答案:

答案 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