2017-02-26 208 views
0

我首先序列化一个按钮,然后对其进行反序列化。但在反序列化中,按钮失去了onclick事件和所有。如果我能在这方面得到一些帮助?反序列化时丢失的序列化对象的属性

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) 
{           
    System.out.println("hello world"); 
}           
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) 
{           
try { 
    f2.createNewFile(); 
    FileOutputStream fos=new FileOutputStream(f2); 
    ObjectOutputStream oos=new ObjectOutputStream(fos); 
    oos.writeObject(c); 
    oos.flush(); 
    System.out.println("done"); 
    cont.remove(jButton2);//serializing above jButton2 
    oos.close(); 
} 
    catch (Exception ex) 
{ 
    ex.printStackTrace(); 
}  
}           
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) 
{           
    FileInputStream fis; 
    JButton b; 
try { 
    fis = new FileInputStream("nnn.java"); 
    ObjectInputStream ois=new ObjectInputStream(fis); 
    b=(JButton)ois.readObject(); 
    bg.add(b); 
    bg.revalidate(); 
    bg.repaint(); 
     } 
    catch (Exception ex) 
    { 
    System.err.println("error"); 
    }  
}           
+0

以上bg是面板到我加入反序列化的按钮B – Aditya

+0

是什么''中oos.writeObject(C)C';在反序列化' –

+0

你说”按钮失去了它的onclick事件和所有“ - 什么是?什么迷路了?你应该知道序列化只保存一个Onject状态(变量内容)而不是它的类(方法和逻辑所在的地方) –

回答

0

你可能意思是“按钮丢失了它的听众”,对吧?

事情是这样的:

JButton jButton = new JButton(); 
jButton.addActionListener(e -> { 
    System.out.println("Event: " + e); 
}); 

的问题是,JButton(其前身AbstractButton)使用EventListenerList类来存储侦听器。列表类具有字段listenerList,它被标记为瞬态

protected transient Object[] listenerList = ... 

暂态字段没有被序列化。

我认为这里的解决方案是在反序列化之后重新填充按钮的侦听器。

JButton jButton = deserializeButton(); 
createButtonListeners().forEach(listener -> jButton.addActionListener(listener)); 
+0

你能告诉我,我是否可以从listenerList中删除瞬态。如果它能解决我的问题。 – Aditya

+0

我不这么认为。 EventListenerList是一个标准的Java类,所以你不能修改它。你将不得不在JButton中实现你自己的监听器处理,我不认为这是可靠的解决方案或值得。第二件事是,这个领域为什么是暂时的(可能)是有原因的。我不会试图弯曲这个功能。我认为重新使用对象反序列化的听众是一条路。 –