Jump to content
João Dias

Dúvida em Java - Classe Serializable

Recommended Posts

João Dias

Boas, tudo bem?

Tenho uma classe que implementa a interface Serializable com este método

public Jogo carregarJogo(ObjectInputStream in) throws IOException,
               ClassNotFoundException {
           return (Jogo) in.readObject();
       }

E no MAIN tenho isto

try {
                  
                       FileInputStream fin = new FileInputStream(fich);
                       ObjectInputStream in = new ObjectInputStream(fin);

                       Jogo s = new Jogo();
                      
                       s=s.carregarJogo(in);
                       in.close();
                            

                      
                   } catch (IOException io) {
                        System.out.println("ola2");
                       
                   } catch (ClassNotFoundException cNF) {
                        System.out.println("ola23");
                   }

Ele vai-me sempre para o catch (IOException io) e não estou a entender porquê. Visto que o ficheiro que tenho é um ficheiro .dat com o estado de um objecto jogo, não seria suposto ele carrega-lo sem quaisquer problemas?

Obrigado!

Share this post


Link to post
Share on other sites
jamirooo

E como é que estás a fazer a escrita do estado do jogo para o ficheiro?

Share this post


Link to post
Share on other sites
João Dias

E como é que estás a fazer a escrita do estado do jogo para o ficheiro?

 public void gravarJogo(ObjectOutputStream out) throws IOException {
            out.writeObject(this);
        }

Share this post


Link to post
Share on other sites
jamirooo

Experimenta então a fazer out.close() depois de fazeres o write e vê se fica resolvido o problema.

Share this post


Link to post
Share on other sites
Baderous

Se em vez de teres um println("ola2") que não serve para nada, tivesses um io.printStackTrace(); talvez desse para perceber o porquê do erro.

Share this post


Link to post
Share on other sites
João Dias

Experimenta então a fazer out.close() depois de fazeres o write e vê se fica resolvido o problema.

Fiz-lo agora e não resolveu, mas obrigado pela dica, pois acabei por adicionar.

Se em vez de teres um println("ola2") que não serve para nada, tivesses um io.printStackTrace(); talvez desse para perceber o porquê do erro.

Sim, o println("ola") não serve para nada, foi mesmo para ver se entrava naquele catch ou não. No entanto não sabia dessa método e agradeço-te pela dica.

Registou este erro :

java.io.InvalidClassException: Core.P_Auxiliar; Core.P_Auxiliar; no valid constructor
        at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:713)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at Core.Jogo.carregarJogo(Jogo.java:72)
        at mesa.Mesa$MenuBar$6.actionPerformed(Mesa.java:409)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1223)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1264)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.io.InvalidClassException: Core.P_Auxiliar; no valid constructor
        at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:471)
        at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:310)
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:547)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
        ... 35 more

Já percebi porquê de não serem válidos os construtores, pois ambas as classes são sub-classe de uma outra classe que não tinha implementado a interface Serializable.

EDIT:

Já faz a serialização correctamente.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.