66

Ho questa eccezione Non capisco perché verrebbe generata o come dovrei gestirla.java.io.NotSerializableException

try { 
    os.writeObject(element); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Dove element è un TransformGroup contenente qualche altro TransformGroups un'istanza della Atom classe:

public class Atom extends Group implements Serializable{ 
    float pozX,pozY; 
    Group group= new Group(); 
    Color3f blue = new Color3f(new Color(255)); 
    Color3f black = new Color3f(new Color(0)); 
    Sphere AtSph=new Sphere(); 

    public Atom(final float WEIGHT, final int BOUNDS,final float radius,Color3f color) 
    { 
     AppSetting ap= new AppSetting(color, black); 
     AtSph=new Sphere(radius,1,100,ap); 
    } 
} 

Il log di errore completo:

java.io.NotSerializableException: javax.media.j3d.TransformGroup 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at cls.MolecularBuilder.addAtom(MolecularBuilder.java:511) 
    at cls.MolecularBuilder$Console.HidrogenItemActionPerformed(MolecularBuilder.java:897) 
    at cls.MolecularBuilder$Console$2.actionPerformed(MolecularBuilder.java:746) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.AbstractButton.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Nota: appSetting (in classe Atom) è solo una classe personalizzata che estende l'aspetto.

+2

Sembra' javax.media.j3d.TransformGroup' stesso non implementa Serializable – micha

risposta

146

I campi dell'oggetto hanno a loro volta i rispettivi campi, alcuni dei quali non implementano Serializable. Nel tuo caso la classe incriminata è TransformGroup. Come risolverlo?

  • se la classe è tuo, renderlo Serializable
  • se la classe è 3a parte, ma non è necessario nella forma serializzata, contrassegnare il campo come transient
  • se avete bisogno dei suoi dati ed è di terze parti, prendi in considerazione altri mezzi di serializzazione, come JSON, XML < BSON, MessagePack, ecc. in cui è possibile serializzare oggetti di terze parti senza modificare le loro definizioni.
+2

Beh, grazie mille, sarà un molto difficile cosa fare, dal momento che i miei oggetti esistono solo come parte di TransformGroup e non ci sono variabili che li memorizzano. La mia app è un generatore di molecole 3d, e tutti i miei atomi e limiti sono appena aggiunti al TransformGroup come istanze, ad esempio (nuovo Atom()). Il problema non è solo che ho bisogno che siano scritti su un file, ma che l'utente possa voler rimuovere o modificare gli oggetti correnti.Penso che proverò con la serializzazione basata su XML, ma sono abbastanza nuovo nel concetto e per me è ancora un po 'difficile. Grazie –

+8

Per aggiungere a questa eccellente risposta: se hai bisogno dei suoi dati ed è di terze parti, potresti voler avvolgere la classe di terze parti nella tua classe, che implementa 'Serializable' e usa' readObject() 'e' writeObject() 'per serializzare manualmente i dati della classe di terze parti. In alcuni casi questo potrebbe essere un approccio ragionevole. http://stackoverflow.com/a/12963580/1208581 – sulai

11

Rendere serializzabile la classe implementando l'interfaccia java.io.Serializable.

  • java.io.Serializable - Marker Interface che non contiene alcun metodo.
  • Scopo dell'interfaccia marker - per indicare allo ObjectOutputStream che questo oggetto è un oggetto serializzabile.
47

volte "java.io.NotSerializableException" si verifica quando si serializza un'istanza classe interna perché:

"serializzazione di un caso del genere classe interna si tradurrà in serializzazione dei suoi associati istanza di classe esterna come pure "

" serializzazione di classi interne (cioè classi nidificate che non sono classi utente statici), tra c locale e anonima lasses, è fortemente scoraggiato "

Rif: The Serializable Interface