2017-02-26 3 views
0

Ich Serialisiert zuerst eine Schaltfläche und deserialisierte es dann. Aber bei der Deserialisierung hat der Button seine Onclick-Ereignisse und alle anderen verloren. Könnte ich Hilfe dazu bekommen?Eigenschaften des serialisierten Objekts verloren beim Deserialisieren

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

oben bg ist eine Platte, an der ich bin Hinzufügen der entserialisierten Taste b – Aditya

+0

was ist 'c' in 'oos.writeObject (c);' –

+0

Sie sagen, „auf der Deserialisierung der Knopf seine Onclick Ereignisse verloren und alle "- Was ist alles? was ist verloren gegangen ?? Sie sollten wissen, dass die Serialisierung nur einen Onject-Zustand (variable Inhalte) speichert, nicht seine Klasse (wo Methoden und Logik) –

Antwort

0

Sie haben wahrscheinlich gemeint "Knopf verloren seine Zuhörer", richtig?

Etwas wie folgt aus:

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

Das Problem ist, dass JButton (sein Vorgänger AbstractButton) verwendet EventListenerList Klasse Hörer zu speichern. Die Listenklasse hat das Feld listenerList, das als transient markiert ist.

protected transient Object[] listenerList = ... 

Transiente Felder sind nicht serialisiert.

Ich denke Lösung hier ist, Hörer der Schaltfläche nach Deserialisierung neu zu bevölkern.

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

können Sie mir sagen, ob ich nur die Transienten von ListenerList entfernen könnte. Wenn es mein Problem lösen könnte. – Aditya

+0

Ich glaube nicht. EventListenerList ist eine Standard-Java-Klasse und kann daher nicht geändert werden. Sie müssten Ihre eigene Listener-Handhabung in JButton implementieren und ich denke nicht, dass das eine zuverlässige Lösung wäre oder es wert wäre. Die zweite Sache ist, dass es einen Grund gibt, warum das Feld (wahrscheinlich) vorübergehend ist. Ich würde nicht versuchen, diese Funktionalität zu verbiegen. Ich denke, die Wiedererkennung der Zuhörer bei der Deserialisierung von Objekten ist der richtige Weg. –

Verwandte Themen