Java:具有Seri​​alizable问题的ObjectOutputStream

时间:2009-09-11 16:08:08

标签: java sockets serialization 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

2 个答案:

答案 0 :(得分:8)

Java中的嵌套类实际上不存在于字节代码级别 - 编译器通过插入隐藏字段,访问方法和构造函数来伪造它们。在您的情况下,Command的匿名子类可能具有编译器生成的对其创建的MyKeyListener实例的引用,即使该引用未用于任何内容。

要解决此问题,请使用Command的顶级子类而不是匿名类。

答案 1 :(得分:0)

提示:尝试在(匿名)Command类execute()方法中键入MyKeyListener.this.toString()。