Java - Язык:ObjectOutputStream с Сериализуемой проблемой
-
05-07-2019 - |
Вопрос
У меня есть эти три класса:
Команда:
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
Решение
Вложенные классы в Java на самом деле не существуют на уровне байтового кода - компилятор подделывает их, вставляя скрытые поля, методы доступа и конструкторы.В вашем случае анонимный подкласс Command
вероятно, имеет сгенерированную компилятором ссылку на MyKeyListener
экземпляр, в котором он был создан, даже если эта ссылка ни для чего не используется.
Чтобы исправить это, используйте подкласс верхнего уровня Command вместо анонимного класса.
Другие советы
Подсказка:Попробуйте ввести MyKeyListener.this.toString() в методе execute() (анонимного) командного класса.