Java:Serializable問題を伴うObjectOutputStream
-
05-07-2019 - |
質問
次の3つのクラスがあります:
コマンド:
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
解決
Javaのネストされたクラスは、実際にはバイトコードレベルでは存在しません。コンパイラは、非表示フィールド、アクセスメソッド、およびコンストラクターを挿入することにより、それらを偽装します。あなたの場合、 Command
の匿名サブクラスには、コンパイラが生成した MyKeyListener
インスタンスへの参照が含まれています。
これを修正するには、匿名クラスの代わりにCommandの最上位サブクラスを使用します。
他のヒント
ヒント:(匿名の)Commandクラスのexecute()メソッドにMyKeyListener.this.toString()と入力してみてください。
所属していません StackOverflow