Java: problème ObjectOutputStream avec Serializable
-
05-07-2019 - |
Question
J'ai ces trois classes:
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 d'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 le suivant: si je lance le code et qu'il souhaite envoyer une commande. Les flux cesse d'écrire
car " MyKeyListener is not Serializable " ??? !! Mais je n’essaye jamais d’envoyer MyKeyListener
La solution
En réalité, les classes imbriquées en Java n'existent pas au niveau du code octet - le compilateur les simule en insérant des champs cachés, des méthodes d'accès et des constructeurs. Dans votre cas, la sous-classe anonyme de la Commande
contient 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 à aucune fin.
Pour résoudre ce problème, utilisez une sous-classe de niveau supérieur de Command au lieu d'une classe anonyme.
Autres conseils
Conseil: essayez de taper MyKeyListener.this.toString () dans la méthode (anonymous) Command de la méthode execute ().