论坛首页 入门技术论坛

netbeans序列化问题

浏览 1962 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-05-03  

现在我们项目中遇到如下的问题:希望有人知道的帮忙解决下.

在被定义了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();
        }
    }

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics