1

あるクラスから別のクラスにオブジェクトを送信するプログラムを作成しています。これは、問題を表す私のプログラムの短いサンプル例です。ご覧のとおり、サーバーからクライアントに送信するオブジェクトは、各クラス (サーバー/クライアント) で個別に定義された Student クラスです。正常に動作する 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

同じ名前のクラスが2つあるだけでは不十分です。2つのクラスが必要です

  • 同じパッケージ
  • もしあれば同じ外部クラスにいる
  • 同じserialVersionUIDを持っています。

クライアントとサーバーの両方に共通する単一のスタンドアロンクラスを用意することをお勧めします。より複雑なプロジェクトでは、クライアントモジュールとサーバーモジュールの両方が依存するモジュールにこれらの共通コンポーネントを構築することを検討できます。

于 2012-10-16T08:26:02.213 に答える
4

クラスXのインスタンスを表すストリームをクラスYのインスタンスに逆シリアル化することはできません。

問題を解決するには、Studentクラスのコードを別のファイル(Student.javaなど)に移動し、その単一のクラスをクライアントコードとサーバーコードで使用する必要があります。

クラスを変更する場合、ほとんどの場合、サーバーを再デプロイする必要があることに注意してください(そうしないと、クライアントは、クライアントだけが知っているクラスのインスタンスを表すストリームをサーバーに送信します)。

于 2012-10-16T08:24:54.553 に答える
2

2つの異なるクラスを参照しています。Studentこれはの内部でClientSideあり、Studentこれはの内部クラスですServerSideStudentクラスを別のファイルに移動する必要があります。

于 2012-10-16T08:26:25.947 に答える