Warum löst writeObject java.io.NotSerializableException aus und wie behebe ich es?

Lesezeit: 6 Minuten

Andern Sie die Grose eines Arrays wahrend Sie die aktuellen
Mihai Bujanca

Ich habe diese Ausnahme und ich verstehe nicht, warum sie ausgelöst wird oder wie ich damit umgehen soll.

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

Woher element ist ein TransformGroup etwas anderes enthält TransformGroups eine Instanz der Klasse 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);
    }
}

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)

AppSetting (in der Atom-Klasse) ist nur eine benutzerdefinierte Klasse, die Appearance erweitert.

  • Sieht aus wie javax.media.j3d.TransformGroup selbst implementiert Serializable nicht

    – micha

    15. Dezember 2012 um 20:26 Uhr

  • Warum tut Atom beide verlängern Group und habe ein Group Mitglied?

    – Benutzer207421

    12. April 2020 um 23:06 Uhr

Warum lost writeObject javaioNotSerializableException aus und wie behebe ich es
Bozo

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

  • Wenn die Klasse Ihnen gehört, machen Sie es Serializable
  • Wenn es sich bei der Klasse um eine Drittanbieterklasse handelt, Sie sie jedoch nicht in der serialisierten Form benötigen, markieren Sie das Feld als transient
  • Wenn Sie seine Daten und die von Drittanbietern benötigen, ziehen Sie andere Serialisierungsmethoden wie JSON, XML, BSON in Betracht. MessagePackusw., wo Sie Objekte von Drittanbietern serialisieren können, ohne ihre Definitionen zu ändern.

  • Nun, vielen Dank, das wird ziemlich schwierig, da meine Objekte nur als Teil der TransformGroup existieren und es keine Variablen gibt, die sie speichern. Meine App ist ein 3D-Molekül-Builder, und alle meine Atome und Grenzen werden nur als Instanzen zur TransformGroup hinzugefügt, z. B. (new Atom()). Das Problem ist nicht nur, dass ich sie in eine Datei schreiben muss, sondern dass der Benutzer möglicherweise aktuelle Objekte entfernen oder bearbeiten möchte. Ich denke, ich werde eine XML-basierte Serialisierung ausprobieren, aber ich bin ziemlich neu in dem Konzept und es ist noch ein bisschen schwierig für mich. Danke

    – Mihai Bujanca

    15. Dezember 2012 um 20:35 Uhr

  • Um diese hervorragende Antwort zu ergänzen: Wenn Sie seine Daten und den Drittanbieter benötigen, möchten Sie möglicherweise die Klasse des Drittanbieters in Ihre eigene Klasse einbinden, die implementiert wird Serializable und verwendet readObject() und writeObject() um die Daten der Drittanbieterklasse manuell zu serialisieren. In manchen Fällen mag dies ein vernünftiger Ansatz sein. stackoverflow.com/a/12963580/1208581

    – sulai

    9. März 2014 um 18:10 Uhr


1647257828 52 Warum lost writeObject javaioNotSerializableException aus und wie behebe ich es
Tho

java.io.NotSerializableException kann auftreten, wenn Sie eine serialisieren Instanz einer inneren Klasse da:

die Serialisierung einer solchen Instanz einer inneren Klasse führt auch zur Serialisierung ihrer zugeordneten Instanz einer äußeren Klasse

Serialisierung innerer Klassen (dh verschachtelte Klassen, die keine statischen Mitgliedsklassen sind), einschließlich lokaler und anonymer Klassen, ist
dringend abgeraten

Ref: Die serialisierbare Schnittstelle

  • Dies war bei mir der Fall. Es geschah, als ich bei einem Komponententest eine Abkürzung nahm. Ich hoffe, diese Antwort spart jemand anderem Zeit.

    – Benutzer489041

    12. Juni 2019 um 14:35 Uhr

  • Ich hatte ein Feld private final Set ausgehend = new TreeSet(new Comparator() { public int Compare(ClaimsNode o1, ClaimsNode o2) { return o1.getNativeIndex() – o2.getNativeIndex(); } });

    – Witali Sasanowitsch

    26. August 2019 um 15:36 Uhr

  • Erstaunlich, ich war buchstäblich in der letzten 1 Stunde damit beschäftigt. Ich fing an zu zweifeln, dass selbst primitive Ints nicht serialisierbar sind, und dann fiel mir ein, dass hier vielleicht wirklich etwas nicht stimmt.

    – Shivam Pokhriyal

    15. Juni 2020 um 9:49 Uhr

1647257828 411 Warum lost writeObject javaioNotSerializableException aus und wie behebe ich es
Prabhakar

Machen Sie die Klasse serialisierbar, indem Sie die Schnittstelle implementieren java.io.Serializable.

  • java.io.Serializable – Marker-Schnittstelle, die keine Methoden enthält.
  • Zweck der Marker-Schnittstelle – um das zu sagen ObjectOutputStream dass dieses Objekt ein serialisierbares Objekt ist.

  • Sie können die Frage lesen, die Serializable bereits implementiert. Immer noch 12+ erstaunt mich.

    – shaILU

    11. Januar 2019 um 10:35 Uhr

Wenn es sich bei der Klasse um eine Drittanbieterklasse handelt, müssen Sie sie wie oben erwähnt in ein JSON/XML/BSON-Objekt konvertieren, da das Klassenobjekt des Drittanbieters nicht serialisiert werden kann.

Ich habe an meinem Projekt gearbeitet und hatte das gleiche Problem und habe die gson-Bibliothek verwendet, um mein Klassenobjekt in einen JSON-String zu konvertieren. Danach habe ich diesen String in diesem Objekt verwendet und durch das ObjectOutputStream-Objekt geleitet. Und auf der Clientseite habe ich dasselbe verwendet, um den JSON-String wieder auf das Klassenobjekt des Drittanbieters zurückzusetzen.

Sie können die Dose hier herunterladen: https://jar-download.com/artifacts/com.google.code.gson/gson/2.8.2/source-code!

So habe ich es gemacht:

// Method that returns String through a Object as a parameter i.e to be converted

 public static String  generateJSONStringFromObject(ThirdPartyClass object) throws JsonProcessingException{
            ObjectMapper mapper = new ObjectMapper();
            mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
            String jsonString = mapper.writeValueAsString(object);
            
                return jsonString;
        }

// Method that returns Object through a String as a parameter 

 public static ThirdPartyClass generateObjectFromJSONString(String jsonString){
            Gson gson = new Gson();
            ThirdPartyClass thirdPartyClassObject = gson.fromJson(jsonString, ThirdPartyClass.class);
            return thirdPartyClassObject;
        }

1001340cookie-checkWarum löst writeObject java.io.NotSerializableException aus und wie behebe ich es?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy