Java: Object mit Serializable Problem
-
05-07-2019 - |
Frage
Ich habe diese drei Klassen:
Befehl:
package pack;
public abstract class Command impements java.io.Serializable
{
public abstract void execute();
}
Auftraggeber:
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:
Dieser keyListener wird zu einer Komponente in einem 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()....
}
Das Problem ist: Wenn ich den Code ausführen, und er will einen Befehl senden. Die Ströme hört auf zu schreiben
weil "MyKeyListener ist nicht Serializable" ??? !! Aber ich versuche, nie MyKeyListener
zu senden
Lösung
Verschachtelte Klassen in Java existieren eigentlich nicht auf Byte-Code-Ebene - der Compiler täuscht sie durch versteckte Felder einfügen, Zugriffsmethoden und Konstrukteure. In Ihrem Fall hat die anonyme Unterklasse von Command
wahrscheinlich einen Compiler generierte Verweis auf die MyKeyListener
Instanz, in der sie erstellt wurde, auch wenn diese Referenz nicht für alles verwendet wird.
Um dies zu beheben, verwenden Sie eine Top-Level-Unterklasse von Befehl statt einer anonymen Klasse.
Andere Tipps
Hinweis: Versuchen Sie MyKeyListener.this.toString () in der (anonymen) Command Klasse Methode execute () eingeben
.