2012-02-19 1 views
2

J'essaie d'envoyer un objet Java sérialisé d'un client à un serveur via le socket, mais il y a une erreur de distribution côté serveur et je n'arrive pas à comprendre pourquoi. La classe en cours de sérialisation est ci-dessous. (. J'utilise Eclipse, et cette classe est à la fois le client package et le package serveur)erreur lors du gonflement d'un objet sérialisé côté serveur

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"; 
    } 
} 

côté client, je l'ai fait:

Simple obj = new Simple(); 
Socket socket = new Socket(hostname, portNum); 
ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 
objOut.writeObject(obj); 
objOut.flush(); 
objOut.close(); 

sur le côté serveur, je l'ai fait :

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

Cependant, je suis l'erreur:

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

J'ai essayé quelque chose de similaire avec le serveur et le client dans un seul paquet, et la sérialisation et l'inflation ont fonctionné. J'apprécierais vraiment si vous pouvez m'aider à découvrir pourquoi cela ne fonctionne pas ici.

Répondre

0

Simplement mis; Pour éviter que deux types dans des espaces de noms différents ne se rencontrent, le nom du package fait partie du nom de type .

Ce qui se passe est que le client sérialise un client.Simple, que le serveur désérialise également en tant que client.Simple. Ensuite, vous continuez en le transformant en server.Simple, qui est un type entièrement différent.

Il peut être montré en faisant;

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

Le code indique que le serveur sait que le type de l'objet désérialisé est client.Simple, et il peut tout simplement pas jeter le type séparé server.Simple.

0

// c'est "serveur de paquets"; côté serveur Alors, avez-vous deux classes Simple différentes? Ce que je veux dire, est-ce que vous déclarez la classe "Simple" deux fois sous deux paquets différents, donc ils sont différents et ne peuvent pas être chat. Avoir seulement une classe. Vous pouvez utiliser ce tutorial.

0
  • Ce que vous sérialisation et l'envoi est class client.simple
  • Mais sur l'objet reçu que vous essayez de cataloguée à une autre classe class server.simple
  • Ce sont deux classes différentes et par conséquent, vous obtenez l'exception.
  • Assurez-vous que le serveur a accès à la classe client.simple utilisée pour la sérialisation.
Questions connexes