现在我们项目中遇到如下的问题:希望有人知道的帮忙解决下.
在被定义了transient以后是不能被序列化的,只能通过重载WriteObject,ReadObject来序列化被定义的参数.
我们是监听netbeans平台上的鼠标跟键盘事件,通过Toolkit,然后在eventDispatched处理,相信很多人都用过.
得到的AWTEvent应该是 ACTION(操作) ON SOURCE(应该是一个组建,假设是鼠标事件,那就是被点击的那个组建)形式的.我们通过序列化可以反序列化得到ACTION ON NULL.因为SOURCE是一个OBJECT,被定义了transient.
然后我们重载了WriteObject,ReadObject. 想把SOURCE也保存进去. 但是就是出错.java.io.NotSerializableException.
在SOURCE这个OBJECT里所指的东西(我认为是组建,但是组建已经被定义了Serializable).所以应该不会出现这个错误才对的.
这个应该指的我们要序列化的类或者其他不可序列化(不知道我的理解是否正确).
然后我就做了一下的一个JFrame来验证, 里面含有JButton,TextField,JToolBar.然后同样我用Toolkit来监听,重载WriteObject,ReadObject. 然后保存到文件中,从文件出然后重构AWTEvent,完全没有错误.我们用系统队列PostEvent也能执行这个动作,就是说ACITON ON SOURCE已经完全被序列化保存,然后读取重构出来.但是为什么在netbeans平台上的事件获取以后不能被序列化呢,I'm puzzled.希望了解的高手们能帮忙解决下,或者提供一些建议.
以下是一些我们JFrame的代码:
/*建立我们所需要的JFrame,并且监听Mouse事件*/
private void jbInit() throws Exception
{
jButton1.setText("button1");
textField1.setText("textField1");
menu.setLabel("file");
menuitem.setLabel("file-one");
menubar.add(menu);
menu.add(menuitem);
jButton1.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jButton1_actionPerformed(e);
}
});
this.setTitle("Test");
this.setMenuBar(menubar);
this.add(jButton1,BorderLayout.SOUTH); //设置JButton
this.add(textField1, BorderLayout.CENTER); //设置textField
this.add(toolbar,BorderLayout.NORTH);//设置toolbar
Toolkit.getDefaultToolkit().addAWTEventListener(a,AWTEvent.MOUSE_EVENT_MASK);//监听鼠标事件
addWindowListener(new WinListener());
}
/*eventDispatched处理函数, myevent是我定义的一个类,应该叫myobject的因为只是存储AWTEvent的SOURCE*/
public void eventDispatched(AWTEvent event)
{
switch(event.getID())
{
case KeyEvent.KEY_PRESSED:
case KeyEvent.KEY_RELEASED:
return;
case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED:
break;
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
case MouseEvent.MOUSE_ENTERED:
case MouseEvent.MOUSE_EXITED:
return;
default:
return;
}
myevent = new Myevent(event.getSource());//获取SOURCE
EventQueue eq= Toolkit.getDefaultToolkit().getSystemEventQueue();//获得系统事件队列
try
{
// System.out.println(myevent.getobject());
ObjectOutputStream out = new ObjectOutputStream(new
FileOutputStream("Label.txt"));//保存AWTEvent,不含SOURCE,上面提过
ObjectOutputStream out1 = new ObjectOutputStream(new
FileOutputStream("Label1.txt"));//保存SOURCE
out.writeObject(myevent);
out1.writeObject(event);
out.close();
out1.close();
ObjectInputStream in = new ObjectInputStream(new
FileInputStream("Label.txt"));//读取AWTEvent
ObjectInputStream in1 = new ObjectInputStream(new
FileInputStream("Label1.txt"));//读取SOURCE
Myevent readobject = (Myevent)in.readObject();
AWTEvent readevent = (AWTEvent) in1.readObject();
in.close();
in1.close();
System.out.println(readobject.getobject());
readevent.setSource(readobject.getobject());//设置读取到的AWTEvent的source
eq.postEvent(readevent);//执行读到的AWTEvent
}
catch(Exception e)
{
e.printStackTrace();
}
}