2010-04-22 5 views
2

J'ai deux classes X et Y, comme celui-ci:problème de sérialisation Java

class X implements Serializable 
{ 
    int val1; 
    Y val2; 
} 

class Y implements Serializable 
{ 
    int val; 
} 

Je veux transmettre un objet de type X à partir d'un client au serveur, mais je ne peux pas parce que la classe X a un champ de type Y. J'ai remplacé le champ de type Y par un champ de type X dans la classe X et cela fonctionne.

EDIT Ce sont mes classes:

class Y implements Serializable 
{ 
    int val; 
    Y() 
    { 
    val = 3; 
    } 
} 

class X implements Serializable 
{ 
    int val; 
    Y ob; 

    X(int i, Y o) 
    { 
    val = i; 
    ob = o; 
    } 
} 

public class Server 
{ 
    public static void main(String[] s) 
    { 
    ServerSocket ss = null; 
    Socket cs = null; 
    ObjectInputStream ois = null; 
    ObjectOutputStream oos = null; 

    try 
    { 
    ss = new ServerSocket(1234); 
    System.out.println("Server pornit!"); 
    cs = ss.accept(); 

    oos = new ObjectOutputStream(cs.getOutputStream()); 
    ois = new ObjectInputStream(cs.getInputStream()); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exceptie!"); 
    } 

    System.out.println("Asteapta mesaj..."); 
    X x; 

    try 
    { 
    x = (X) ois.readObject(); 
    System.out.println(x.val); 

    } 
    catch(Exception e) 
    { 
     System.out.println(e.toString()); 
    } 
    try 
    { 
    ss.close(); 
    cs.close(); 
    } 
    catch(Exception e) 
    { 
    } 

    } 
} 
public class Client 
{ 
    public static void main(String[] s) 
    { 
    Socket cs; 
    ObjectInputStream ois = null; 
    ObjectOutputStream oos = null; 

    System.out.println("Connect..."); 
    try 
    { 
    cs = new Socket("127.0.0.1",1234); 

    oos = new ObjectOutputStream(cs.getOutputStream()); 
    ois = new ObjectInputStream(cs.getInputStream()); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exceptie!"); 
    } 


    try 
    { 
    oos.writeObject(new X(8,new Y())); 
    } 
    catch(Exception e) 
    { 
     System.out.println(e.getMessage()); 
    } 
    } 
} 
+0

Utilisez-vous ObjectOutputStream et ObjectInputStream? Quel genre d'erreurs voyez-vous? Si vous utilisez 2 processus: Êtes-vous sûr de fournir la même version des classes compilées aux deux? –

+2

Que diriez-vous du code de sérialisation? Empiler des traces? Vous ne pouvez pas transmettre une instance 'X'? Pourquoi pas? Qu'est-ce qui se passe quand vous essayez? Quand vous changez «Y» en «X» et «ça marche», qu'est-ce que cela signifie exactement? – erickson

+0

Oui j'utilise ObjectOutputStream et ObjectInputStream et oui les mêmes classes sont dans le client et le serveur. L'exception est renvoyée dans le serveur lors de la réception de l'objet de type X. L'exception est la suivante: "java.net.SocketException: Connection reset" – Stefan

Répondre

1

Ok, je pense avoir trouvé le problème. Le processus client se termine prématurément avant de fermer le flux de sortie. Par conséquent, le serveur obtient une déconnexion inattendue. Ajoutez oos.close() au code client.

+0

Eyal a raison. Maintenant ça marche ... Merci à tous !!! – Stefan

0

Vérifiez que le client distant a accès aux fichiers .class pour X et (en particulier) Y?

En particulier, si le nouveau Y() ne réussit pas que vous avez un problème :-)

(Quelle est l'erreur que vous obtenez?)

0

Note oreyes: déplacé à l'original poster

0

Il fonctionne sur ma machine:

$javac X.java 
$java Server & 
[1] 14037 
$Server pornit! 
java Client 
Connect... 
Asteapta mesaj... 
$8 

Je me demande si vous n'êtes pas en train de tuer le serveur lorsque vous lancez le client.