Java: ObjectOutputStream con problema serializable
-
05-07-2019 - |
Pregunta
Tengo estas tres clases:
Command:
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:
Este generador de claves se agrega a un componente en 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()....
}
El problema es: si ejecuto el código y él quiere enviar un comando. Las corrientes dejan de escribir.
porque " MyKeyListener no es serializable " ??? !! Pero nunca trato de enviar MyKeyListener
Solución
Las clases anidadas en Java en realidad no existen en el nivel del código de bytes: el compilador las falsifica insertando campos ocultos, métodos de acceso y constructores. En su caso, la subclase anónima de Command
probablemente tenga una referencia generada por el compilador a la instancia de MyKeyListener
en la que fue creada, incluso si esa referencia no se usa para nada.
Para solucionar esto, use una subclase de comando de nivel superior en lugar de una clase anónima.
Otros consejos
Sugerencia: intente escribir MyKeyListener.this.toString () en el método de ejecución () de la clase de comando (anónimo).