Java: ObjectOutputStream с проблемой Сериализуемый - PullRequest
0 голосов
/ 11 сентября 2009

У меня есть три класса:

Команда:

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:

Этот список ключей добавляется в компонент в 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 не Serializable» ??? !!Но я никогда не пытаюсь отправить MyKeyListener

Ответы [ 2 ]

8 голосов
/ 11 сентября 2009

Вложенные классы в Java на самом деле не существуют на уровне байтового кода - компилятор подделывает их, вставляя скрытые поля, методы доступа и конструкторы. В вашем случае анонимный подкласс Command, вероятно, имеет сгенерированную компилятором ссылку на экземпляр MyKeyListener, в котором он был создан, даже если эта ссылка ни для чего не используется.

Чтобы это исправить, используйте подкласс Command верхнего уровня вместо анонимного класса.

0 голосов
/ 11 сентября 2009

Подсказка: попробуйте ввести MyKeyListener.this.toString () в метод execute () класса (anonymous).

...