0

I am creating a program that needs to save an ObservableList and a Theme (which is a variable) in different archives, but my code doesn't work, I tried to convert my ObservableList into an ArrayList (which is Serializable) but it still throws an error. The error is this:

java.io.NotSerializableException: com.sun.javafx.collections.ObservableListWrapper

And my code is this for serialization:

            try{
                File file1 = new File("c:/FmsTimer/saveFmsTimer.fmstiming");
                FileOutputStream fos1 = new FileOutputStream(file1);
                ObjectOutputStream oos1 = new ObjectOutputStream(fos1);
                oos1.writeObject(new ArrayList<session>(listS));
                oos1.close();
                fos1.close();

                File file2 = new File("c:/FmsTimer/cfg.fmstiming");
                FileOutputStream fos2= new FileOutputStream(file2);
                ObjectOutputStream oos2= new ObjectOutputStream(fos2);
                oos2.writeObject(myTheme.name());
                oos2.close();
                fos2.close();

                System.exit(1);
            }catch(IOException ioe){
                ioe.printStackTrace();
            }

This is for reading when the program starts:

   try {
        File file1 = new File("c:/FmsTimer/saveFmsTimer.fmstiming");
        FileInputStream fis = new FileInputStream(file1);
        ObjectInputStream ois = new ObjectInputStream(fis);

        ArrayList arraylistTemp = (ArrayList) ois.readObject();
        ois.close();
        fis.close();
        listS = FXCollections.observableList(arraylistTemp);

        File file2 = new File("c:/FmsTimer/cfg.fmstiming");
        FileInputStream fis2 = new FileInputStream(file2);
        ObjectInputStream ois2 = new ObjectInputStream(fis2);

        String t;
        t = (String) ois2.readObject();
        ois2.close();
        fis2.close();
        myTheme = Themes.valueOf(t);


    }catch(IOException ioe){
        ioe.printStackTrace();
        //return;
    }catch(ClassNotFoundException c){
        System.out.println("Class not found");
        c.printStackTrace();
        // return;
    }

My "listS" is an ObservableList and "myTheme" is an instance of an Enum, "session" is an Class (which is Serializable by the way).

Thanks and if you need more information just let me know. (PS: sorry if I made some english mistakes, it's not my main language)

--UPDATE-- This is the stack trace of the error:

java.io.NotSerializableException: com.sun.javafx.collections.ObservableListWrapper
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.util.ArrayList.writeObject(ArrayList.java:766)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at program.mainClass.lambda$start$2(mainClass.java:183)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)

Hope it helps!

  • [mcve] please .. – kleopatra Sep 24 '19 at 21:32
  • As requested by kleopatra, you need to _create_ a [mre] demonstrating the problem and then add it to your question via an [edit]. The example should include the class you're attempting to serialize, as well as any non-standard classes said class depends on (i.e. the field types)—keeping in mind the example should be _minimal_. Also, the error you give is related to how no core `ObservableList` implementations are `Serializable` but you also mention you get an error when you've copied the elements over to an `ArrayList`; show us the stack trace of that error, please. – Slaw Sep 25 '19 at 13:31
  • @Slaw I updated the question, the stack trace of the error is there now, hope this is what you're looking for. :D and I'll create the minimal reproducible example as soon as I can. – Vicenzo Souza Sep 25 '19 at 22:55
  • @Slaw, so Session starts like this: `public class session implements Runnable, Serializable ` and it has a ObservableList, Solve is like that: `public class solve implements Serializable` the only piece of code that uses serialization is in my question. I think that the ObservableList inside the session class is the problem, if it is, how can I solve it without having to replace it (it is used in a ListView so, it needs to exist), thank you :D – Vicenzo Souza Sep 26 '19 at 17:54
  • You can [customize the serialization process](https://stackoverflow.com/questions/7290777/java-custom-serialization) (see the linked/related questions as well). – Slaw Sep 26 '19 at 19:02

0 Answers0