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
그 참조가 아무것도 사용하지 않더라도 생성 된 인스턴스.
이 문제를 해결하려면 익명 클래스 대신 최상위 하위 클래스의 명령을 사용하십시오.
다른 팁
힌트 : (익명) 명령 클래스 execute () 메소드에서 mykeylistener.this.tostring ()을 입력하십시오.
제휴하지 않습니다 StackOverflow