¿Por qué writeObject arroja java.io.NotSerializableException y cómo lo soluciono?

Resuelto Mihai Bujanca asked hace 11 años • 4 respuestas

Tengo esta excepción y no entiendo por qué se lanzaría o cómo debo manejarla.

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

¿ Dónde elementcontiene TransformGroupotra TransformGroupsinstancia de la clase Atom?

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

El registro de errores 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)

AppSetting(en la clase Atom) es solo una clase personalizada que extiende la apariencia.

Mihai Bujanca avatar Dec 16 '12 03:12 Mihai Bujanca
Aceptado

Los campos de tu objeto tienen a su vez sus campos, algunos de los cuales no implementan Serializable. En su caso, la clase infractora es TransformGroup. ¿Cómo resolverlo?

  • si la clase es tuya, hazlaSerializable
  • Si la clase es de terceros, pero no la necesita en el formulario serializado, marque el campo comotransient
  • Si necesita sus datos y son de terceros, considere otros medios de serialización, como JSON, XML, BSON, MessagePack , etc., donde puede serializar objetos de terceros sin modificar sus definiciones.
Bozho avatar Dec 15 '2012 20:12 Bozho

java.io.NotSerializableExceptionpuede ocurrir cuando serializa una instancia de clase interna porque:

La serialización de una instancia de clase interna de este tipo también dará como resultado la serialización de su instancia de clase externa asociada.

Se desaconseja encarecidamente la serialización de clases internas (es decir, clases anidadas que no son clases miembro estáticas), incluidas clases locales y anónimas.

Ref: La interfaz serializable

Tho avatar Jan 22 '2015 03:01 Tho