2009-09-11 19 views
0

J'ai ces trois classes:Java: ObjectOutputStream avec le problème Serializable

Commande:

package pack; 

public abstract class Command impements java.io.Serializable 
{ 
    public abstract void execute(); 
} 

Client:

package pack; 

// imports.... 

public class Client 
{ 
    Socket socket; 

    // Constructor... 

    public void sendCommand(Command c) 
    { 
     try 
     { 
       new ObjectOuputStream(socket.getOutputStream()).writeObject(c); 
     } catch (Exception e) {e.printStackTrace()}; 
    } 
} 

MyKeyListener:

Ce keylistener est ajouté à un composant dans un JFrame.

public class MyKeyListener implements KeyListener 
{ 

    private Client client; 

    public MyKeyListener(Client c) 
    { client = c; } 


    public void keyTyped(....)......; // This method does nothing 

    public void keyPressed(KeyEvent e) 
    { 
      client.sendCommand(new Command() { 
       public void execute() 
       { 
        new Robot().keyPress(e.getKeyCode()); 
       } 
      }); 
    } 

    // The same for keyRelease().... 
} 

Le problème est: si je cours le code et il veut envoyer une commande. Les flux cessent d'écrire car "MyKeyListener n'est pas sérialisable" ??? !! Mais je n'essaie jamais d'envoyer MyKeyListener

+0

J'espère que les fautes de frappe ne sont pas réellement dans votre code. – Svante

Répondre

8

Les classes imbriquées dans Java n'existent pas réellement au niveau du code octet - le compilateur les falsifie en insérant des champs masqués, des méthodes d'accès et des constructeurs. Dans votre cas, la sous-classe anonyme de Command a probablement une référence générée par le compilateur à l'instance MyKeyListener dans laquelle elle a été créée, même si cette référence n'est utilisée pour rien. Pour résoudre ce problème, utilisez une sous-classe de niveau supérieur de commande au lieu d'une classe anonyme.

0

Indice: Essayez de taper MyKeyListener.this.toString() dans la méthode execute() de la classe Command (anonyme).