Foros del Web » Programación para mayores de 30 ;) » Java »

Porque me sigue marcando NotSerializableException

Estas en el tema de Porque me sigue marcando NotSerializableException en el foro de Java en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Java: Ver original public class Data implements Serializable {     MiDefaultListModel model = new MiDefaultListModel ( ) ;     ArrayList ...
  #1 (permalink)  
Antiguo 16/09/2011, 20:28
Avatar de shujidan  
Fecha de Ingreso: abril-2011
Mensajes: 121
Antigüedad: 13 años
Puntos: 5
Exclamación Porque me sigue marcando NotSerializableException

Código Java:
Ver original
  1. public class Data implements Serializable {
  2.     MiDefaultListModel model = new MiDefaultListModel();
  3.     ArrayList<MiJTabbedPane> jtabs = new ArrayList<MiJTabbedPane>();
  4. }

Lo que quería hacer es guardar una ListBox con un listmodel y un arraylist de jtabbedpane que correspondiera la posicion de cada uno a cada elemento de la lista. Tengo entendido que en Java los Collections ya son Serializables.
Como pueden ver la clase data ya es serializable e incluso extendí la clase DefaultListModel y la clase JTabbedPane para hacerlas serializables.
El problema es que al intentar guardarlo me sale el siguiente error:

Código error::
Ver original
  1. java.io.NotSerializableException: java.io.ObjectOutputStream

El archivo se guarda pero no completamente, sale un WriteAbortedException
y un java.io.NotSerializableException: java.io.ObjectInputStream al intentar leer el archivo.
Así es como intento guardarlo:

Código Java:
Ver original
  1. try {
  2.     obOut = new ObjectOutputStream(new FileOutputStream("data"));
  3.     obOut.writeObject(data);
  4.     obOut.flush();
  5.     obOut.close();
  6. } catch (FileNotFoundException exc) {
  7.     jlabel.setText("No se encontró el archivo de datos");
  8. } catch (Exception exc) {
  9.     jlabel.setText("Hubo un error al escribir al archivo de datos");
  10.     System.out.println(exc + "\nAqui está el error");
  11. }

Última edición por shujidan; 16/09/2011 a las 21:05
  #2 (permalink)  
Antiguo 16/09/2011, 21:07
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Porque me sigue marcando NotSerializableException

Hola:

No sólo tiene que ser Serializable la clase que quieras guardar, sino también todas las clases que son atributos de ella y así sucesivamente. En tu caso, tienen que ser también Serializable MiDefaultListModel y todo lo que esta tenga dentro.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 16/09/2011, 21:45
Avatar de shujidan  
Fecha de Ingreso: abril-2011
Mensajes: 121
Antigüedad: 13 años
Puntos: 5
Respuesta: Porque me sigue marcando NotSerializableException

Mmm, no puedo decir que no me lo esperaba, pues si ese es el caso creo que tengo mucho trabajo por hacer.
Tú o alguien más sabrá una manera sencilla de hacer esto, solo se puede implementar serializable desde la creación de su respectiva clase heredada o alguien sabe implementar al momento de la creación del objeto?

Otra cosa, me daría problemas el uso de eventos para serializar el objeto??:
Tengo que serializar la interfaz MouseListener o algo así?
Código Java:
Ver original
  1. jtabs.get(loquesea).addMouseListener(this);

Última edición por shujidan; 16/09/2011 a las 22:40
  #4 (permalink)  
Antiguo 17/09/2011, 06:35
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Porque me sigue marcando NotSerializableException

No es mucho trabajo, sólo poner "implements Serialzable" en las clases que necesites que se guarden en fichero: Data, MyDefaultTableModel, etc.

Los componentes SWING (como JTabbedPane) ya lo implementan, por lo que no tienes que hacer nada. De todas formas, deberías dar un repaso a tu diseño. No tiene mucha lógica que un arraylist de JTabbedPane forme parte de los "Data". Quizás de ahí te venga el exceso de trabajo que dices que vas a tener.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 17/09/2011, 10:04
Avatar de shujidan  
Fecha de Ingreso: abril-2011
Mensajes: 121
Antigüedad: 13 años
Puntos: 5
Respuesta: Porque me sigue marcando NotSerializableException

Estoy agregando elementos al DefaultListModel de esta forma:

Código Java:
Ver original
  1. model.addElement(Object obj);
Con un string en el lugar del Object que define el nombre del elemento de la lista

y los jtabbedpane solo contienen jtextarea, así que no veo en donde mas implementarle serializable.

Edit: comprobé al guardar los datos por separado que el exception es del jtabbedpane
Todo lo que contiene son new JScrollPane(new JTextArea()), la cual ya extendí, hice serializable y sigue el error.

Código Java:
Ver original
  1. if (((MiJTabbedPane)evento.getSource()).getTitleAt(((MiJTabbedPane)evento.getSource()).getSelectedIndex()) == "+"){
  2.     ((MiJTabbedPane)evento.getSource()).addTab("otro tab", null, new MiJScrollPane(jt = new MiJTextArea()), "tooltiptext");

Alguien que me ayude porfavor!!

Última edición por shujidan; 17/09/2011 a las 11:11
  #6 (permalink)  
Antiguo 17/09/2011, 14:30
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Porque me sigue marcando NotSerializableException

Buenas:

En el código inicial que pusiste no era un DefaultTableModel, sino un MiDefaultTableModel. No sé si lo has cambiado....

Escribe la traza completa de la excepción printstacktrace(), igual te da una pista de qué clase es la que no es serializable. De todas formas, la excepción debería dar al escribir y no al leer.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 17/09/2011, 15:29
Avatar de shujidan  
Fecha de Ingreso: abril-2011
Mensajes: 121
Antigüedad: 13 años
Puntos: 5
Respuesta: Porque me sigue marcando NotSerializableException

En mi código utilizo el MiDefaultListModel heredando a DefaultListModel porque necesitaba implementar la interface Serializable, pero no le agrego ni sobreescribo nada mas que el constructor con super así que en escencia sigue siendo DefaultListModel.
Esta clase no me da problemas pues ya he comprobado que el objeto si se guarda correctamente, no así con el ArrayList<JTabbedPane>
El ArrayList contiene JTabbedPanes cada uno con varias pestañas, un evento de tipo MouseListener que crea otra pestaña al hacer clic en alguna de ellas. Cada pestaña contiene un JTextArea con un KeyListener que guarda el ArrayList completo cuando se suelta una tecla.

Como solo incluye componentes swing el arraylist y tengo entendido que éstos ya son serializables sólo se me ocurre que tengo que serializar las interfaces pero no estoy seguro, alguien que me aclare esta duda porfavor.

Esto es lo que imprime el excepcion.getCause(); null (o sea no existente o desconocida)
Esto es lo que imprime el excepcion.getLocalizedMessage(); java.io.ObjectOutputStream
Esto es lo que imprime el excepcion.printStackTrace();

java.io.NotSerializableException: java.io.ObjectOutputStream
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unkn own Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unk nown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.awt.AWTEventMulticaster.save(Unknown Source)
at java.awt.Component.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknow n Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unk nown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknow n Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unk nown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at SupernotPanel$2.keyReleased(SupernotPanel.java:146 )
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(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.KeyboardFocusManager.redispatchEvent(Unkn own Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEv ent(Unknown Source)

at java.awt.DefaultKeyboardFocusManager.preDispatchKe yEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAsse rtions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent (Unknown Source)
at java.awt.Component.dispatchEventImpl(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$000(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.doIntersectionPri vilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(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.doIntersectionPri vilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(U nknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Última edición por shujidan; 17/09/2011 a las 17:57
  #8 (permalink)  
Antiguo 17/09/2011, 23:56
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Porque me sigue marcando NotSerializableException

Quizás debas hacer Serializable los MouseListener que dices que añades. Al guardar el JTabbedPane, posiblemente estén intentando guardarse también esos MouseListener.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 18/09/2011, 13:21
Avatar de shujidan  
Fecha de Ingreso: abril-2011
Mensajes: 121
Antigüedad: 13 años
Puntos: 5
Respuesta: Porque me sigue marcando NotSerializableException

Terminé inicializando los JTabbedPane dinámicamente en el constructor a partir de un ArrayList de Document en los JTextArea.

Etiquetas: notserializableexception, objectinputstream, serializable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:05.