2012-02-19 7 views
2

クライアントからソケット経由で直列化された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(); 

をサーバー側で、私がやりました:

Exception in thread "main" java.lang.ClassCastException: client.Simple cannot be cast to server.Simple at server.Server.main 

//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(); 

しかし、私はエラーを得ました

私はServerとClientを1つのパッケージに似たものを試してみました。直列化とインフレーションの両方がうまく機能しました。私はなぜそれがここで動作しないかを知るのを助けることができれば本当に感謝します。

答えて

0

簡単に言えば、異なる名前空間の2つの型が衝突するのを避けるために、はパッケージ名が型名の一部です。

クライアントはclient.Simpleをシリアル化し、サーバーもclient.Simpleとしてシリアル化します。その後、完全に異なるタイプのserver.Simpleにキャストします。

これを行うことで表示できます。

ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream()); 
Object anObj = objIn.readObject(); 
System.out.println(anObj);    // Output "[email protected]" 
obj = (server.Simple)anObj;    // Throws ClassCastException 

コードは、サーバが非直列化されたオブジェクトの種類がclient.Simpleあることを知って、それは単に別のタイプserver.Simpleにキャストすることができないことを示しています。

0

//「パッケージサーバー」です。サーバー側で 2つの異なるSimpleクラスがありますか?私が言っているのは、2つの異なるパッケージの下で「シンプルな」クラスを2回宣言しているので、彼らは違っていて猫になれません。クラスは1つだけです。これはtutorialです。

0
  • 何をシリアライズして送信していることはclass client.simple
  • しかし、あなたはこれらの2つの異なるクラスであるので、あなたは例外を取得している別のクラスにclass server.simple
  • それを型キャストしようとしている受信したオブジェクトの上にあります。
  • サーバーが、シリアル化に使用される同じクラスclient.simpleにアクセスできることを確認します。
関連する問題