Java: ObjectOutputStream com problema Serializable
-
05-07-2019 - |
Pergunta
Eu tenho essas três classes:
Comando:
package pack;
public abstract class Command impements java.io.Serializable
{
public abstract void execute();
}
Cliente:
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:
Esta KeyListener é adicionada a um componente em um 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()....
}
O problema é: se eu executar o código e ele quer enviar um comando. Os fluxos pára escrita
porque "MyKeyListener não é Serializable" ??? !! Mas eu nunca tentar enviar MyKeyListener
Solução
Classes aninhadas em Java, na verdade, não existem no nível de código byte - o compilador finge-los através da inserção de campos ocultos, métodos de acesso e construtores. No seu caso, a subclasse anônima de Command
provavelmente tem uma referência gerado pelo compilador para a instância MyKeyListener
em que foi criado, mesmo que essa referência não é usado para qualquer coisa.
Para corrigir isso, use uma subclasse de nível superior do comando em vez de uma classe anônima.
Outras dicas
Dica:. Tente digitar MyKeyListener.this.toString () na classe (anônimo) Comando método execute ()