Java: ObjectOutputStream con problema serializzabile
-
05-07-2019 - |
Domanda
Ho queste tre classi:
Comando:
package pack;
public abstract class Command impements java.io.Serializable
{
public abstract void execute();
}
Cliente:
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:
Questo keylistener viene aggiunto a un componente in 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()....
}
Il problema è: se eseguo il codice e vuole inviare un comando. I flussi smettono di scrivere
perché " MyKeyListener non è serializzabile " ??? !! Ma non provo mai a inviare MyKeyListener
Soluzione
Le classi nidificate in Java in realtà non esistono a livello di codice byte: il compilatore le simula inserendo campi nascosti, metodi di accesso e costruttori. Nel tuo caso, la sottoclasse anonima di Command
probabilmente ha un riferimento generato dal compilatore all'istanza MyKeyListener
in cui è stato creato, anche se quel riferimento non viene utilizzato per nulla.
Per risolvere questo problema, utilizzare una sottoclasse di livello superiore di Command anziché una classe anonima.
Altri suggerimenti
Suggerimento: prova a digitare MyKeyListener.this.toString () nel metodo execute () della classe di comando (anonimo).