2009-09-11 48 views
0

我有這三類:的Java:ObjectOutputStream的序列化與問題

命令:

package pack; 

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

客戶:

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:

此Keylistener被添加到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().... 
} 

問題是:如果我運行代碼,他想發送命令。由於「MyKeyListener不可序列化」,流停止編寫 ???!但我從不嘗試發送MyKeyListener

+0

我希望拼寫錯誤不在您的代碼中。 – Svante 2009-09-11 16:32:17

回答

8

Java中的嵌套類實際上並不存在於字節碼級 - 編譯器通過插入隱藏字段,訪問方法和構造函數來僞造它們。在你的情況下,Command的匿名子類可能有一個編譯器生成的引用,用於創建它的MyKeyListener實例,即使該引用沒有用於任何內容。

要解決此問題,請使用命令的頂級子類而不是匿名類。

0

提示:嘗試在(匿名)Command類execute()方法中鍵入MyKeyListener.this.toString()。