1

我正在编写一个程序来将一个对象从一个类发送到另一个类。这是我的程序的一个简短示例,用于表示该问题。如您所见,从服务器发送到客户端的对象是学生类,该类已在每个类(服务器/客户端)中单独定义。我通过发送一个工作正常的 ArrayList 检查了这段代码,但是当涉及到我自己定义的类类型时,我收到了这个错误:

Exception in thread "main" java.lang.ClassCastException: ServerSide$1Student cannot be cast to ClientSide$1Student
    at ClientSide.main(ClientSide.java:29)

这是服务器端的代码:

import java.io.*;
import java.net.*;

public class ServerSide {

    public static void main(String[] args) {
        class Student implements Serializable
        {
            int id;
            public Student(int num){id=num;}
            public void setID(int num){id=num;}
            public void Print(){System.out.println("id = " + id);}
        }
        try
        {
            Student a = new Student(3);
            ServerSocket myServerSocket = new ServerSocket(9999);
            Socket skt = myServerSocket.accept();   
            try 
            {
                ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream());
                objectOutput.writeObject(a);                
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            } 
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

而对于客户端是:

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSide {

    public static void main(String[] args)
    {
        class Student implements Serializable
        {
            int id;
            public Student(int num){id=num;}        
            public void setID(int num){id=num;}
            public void Print(){System.out.println("id = " + id);}
        }
        try {       
            Socket socket = new Socket("10.1.1.2",9999);
            try {
                ObjectInputStream objectInput = new ObjectInputStream(socket.getInputStream());
                try {
                    Object object =(Student) objectInput.readObject();
                    Student tmp = (Student) object;
                    tmp.Print();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }           
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }   
}

编辑:

我将它们移动到同一个文件并添加了序列化 ID。它工作正常。

4

3 回答 3

12

拥有两个同名的类是不够的。这两个类需要有

  • 同一个包
  • 如果有的话,在同一个外部类中
  • 具有相同的serialVersionUID。

我建议你有一个单独的、独立的类,它对客户端和服务器都是通用的。在更复杂的项目中,您可能会考虑在客户端和服务器模块都依赖的模块中构建这些通用组件。

于 2012-10-16T08:26:02.213 回答
4

您永远无法将表示 X 类实例的流反序列化为 Y 类实例。

要解决您的问题,您需要将该Student类的代码移动到另一个文件,例如 Student.java,并在您的客户端代码和服务器代码上使用该单一类。

请注意,如果您修改您的类,在大多数情况下,您将需要重新部署服务器(否则客户端将向服务器发送一个表示只有客户端知道的类实例的流)。

于 2012-10-16T08:24:54.553 回答
2

您正在引用两个不同的类。Student哪个是 的内部,ClientSide哪个Student是 的内部类ServerSide。您应该将该Student类移动到不同的文件。

于 2012-10-16T08:26:25.947 回答