it-swarm.com.de

java.io.NotSerializableException

Ich habe diese Ausnahme und verstehe nicht, warum es geworfen wird oder wie ich damit umgehen soll.

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

Wobei element ein TransformGroup ist, das eine andere TransformGroups Instanz der Klasse Atom enthält:

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);
    }
}

Das vollständige Fehlerprotokoll:

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)

Hinweis: AppSetting (in Atom class)) ist nur eine benutzerdefinierte Klasse, die Appearance erweitert.

95
Bujanca Mihai

Die Felder Ihres Objekts haben wiederum ihre Felder, von denen einige Serializable nicht implementieren. In Ihrem Fall ist die beleidigende Klasse TransformGroup. Wie man es löst?

  • wenn die Klasse Ihnen gehört, machen Sie es Serializable
  • wenn die Klasse von Drittanbietern stammt, Sie sie jedoch nicht in der serialisierten Form benötigen, markieren Sie das Feld als transient.
  • wenn Sie seine Daten und die Daten von Drittanbietern benötigen, sollten Sie andere Serialisierungsmethoden in Betracht ziehen, z. B. JSON, XML, BSON, MessagePack usw., bei denen Sie Objekte von Drittanbietern serialisieren lassen können, ohne ihre Definitionen zu ändern.
187
Bozho

Manchmal tritt "Java.io.NotSerializableException" auf, wenn Sie eine Instanz der inneren Klasse serialisieren , weil:

"Das Serialisieren einer solchen inneren Klasseninstanz führt auch zur Serialisierung der zugehörigen äußeren Klasseninstanz."

" Die Serialisierung innerer Klassen (dh verschachtelter Klassen, die keine statischen Elementklassen sind), einschließlich lokaler und anonymer Klassen, ist stark entmutigt "

Ref: Die serialisierbare Schnittstelle

68
Tho

Machen Sie die Klasse serialisierbar, indem Sie die Schnittstelle Java.io.Serializable Implementieren.

  • Java.io.Serializable - Marker Interface, das keine Methoden enthält.
  • Zweck der Markierungsschnittstelle - um dem ObjectOutputStream mitzuteilen, dass dieses Objekt ein serialisierbares Objekt ist.
12
Prabhakar