Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在服务器端扩展序列化对象时发生强制转换错误_Java_Sockets_Serialization - Fatal编程技术网

Java 在服务器端扩展序列化对象时发生强制转换错误

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

我试图通过套接字将一个序列化的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();
在服务器端,我做到了:

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。