Pregunta

Quiero guardar los objetos que generé en un programa. Después de reiniciar, la aplicación debería cargar automáticamente todos los objetos en una matriz. Quiero escribirlos en un archivo y analizarlos después de reiniciar. ¿Son las otras posibilidades más inteligentes que hacerlo a mano? Gracias

¿Fue útil?

Solución

Puede usar la clase Berkeley DB PersistentMap para guardar sus objetos ( Serializable ) en una implementación de Map (un caché) que los persiste en un archivo. Es bastante simple de usar y significa que no tiene que preocuparse por qué guardar dónde.

Tres cosas a tener en cuenta sobre la serialización:

  1. ¿Cómo va a hacer frente a los cambios de esquema (es decir, cambiar en qué datos consisten sus clases? por ejemplo, agregar un nuevo campo)
  2. ¿Qué sucede si sus archivos se corrompen? Dependiendo de cuán confiable sea el almacenamiento de su programa, esto afectará su decisión de cómo guardar los datos que sus objetos contienen implícitamente. Recuerde, siempre puede usar una base de datos relacional como MySQL y luego convertir estos datos en sus objetos
  3. ¿Necesita poder ver o consultar los datos fuera de su programa? ¿Qué sucede si desea responder una pregunta simple como "¿cuántos objetos tienen la propiedad X?" Fácil de hacer si ha usado una base de datos (relacional); ¡no es tan fácil si has serializado cosas en archivos!

Otros consejos

Sí, el concepto que está buscando se llama serialización. Hay un buen tutorial en Sun aquí .

La idea es que las clases que desea persistir tienen que implementar la interfaz serializable. Después de eso, usa java.io.ObjectOutputStream.writeObject () para escribir el objeto en un archivo y java.io.ObjectInputStream.readObject () para leerlo nuevamente.

No puede serializar todo, ya que hay cosas que no tienen sentido serializar, pero puede solucionarlas. Aquí hay una cita sobre eso:

  

El mecanismo básico de Java   la serialización es simple de usar, pero   Hay algunas cosas más que saber. Como   mencionados anteriormente, solo los objetos marcados   Serializable puede persistir. los   La clase java.lang.Object no   implementar esa interfaz. Por lo tanto,   no todos los objetos en Java pueden ser   Persistió automáticamente. Las buenas noticias   es que la mayoría de ellos, como AWT y   Swing GUI componentes, cadenas y   matrices - son serializables.

     

Por otro lado, cierta   clases de nivel de sistema como Thread,   OutputStream y sus subclases, y   Los zócalos no son serializables. En efecto,   no tendría ningún sentido si   fueron. Por ejemplo, hilo que se ejecuta en   mi JVM estaría usando mi sistema   memoria. Persistiendo e intentando   ejecutarlo en tu JVM no tendría sentido   en absoluto. Otro punto importante sobre   java.lang.Object no implementa el   Interfaz serializable es que cualquier   clase que creas que se extiende solo   Objeto (y ningún otro serializable   clases) no es serializable a menos que   usted implementa la interfaz usted mismo   (como se hizo con el ejemplo anterior).

     

Esa situación presenta un problema:   ¿Qué pasa si tenemos una clase que contiene   una instancia de hilo? En ese caso,   ¿Podemos persistir los objetos de ese   ¿tipo? La respuesta es sí, siempre y cuando   decirle al mecanismo de serialización nuestra   intenciones marcando nuestra clase   Enhebre el objeto como transitorio.

Es posible que desee consultar Java efectivo para algunos problemas con respecto a la serialización. En general, estos son avanzados, pero si esta característica es una parte central de su aplicación, querrá saber sobre ellos de antemano.

Los ejemplos incluyen problemas de seguridad, herencia y, lo que es más importante, el potencial de "congelar" públicamente una API al realizarla (por ejemplo, en todas las versiones de software). Nuevamente, todos estos son avanzados y no deberían disuadirlo per se.

java.io.Object [Input / Output] Stream son las dos clases que debe observar.
Cualquier clase que desee conservar para archivar necesita implementar la interfaz java.io.Serializable.

Es posible que también desee considerar el uso de la codificación XML, que me parece que tiene más durabilidad que la serialización. Utilice las clases java.beans.XMLEncoder / XMLDecoder .

No lo he usado, pero Google Code lanzó protobuf recientemente.

Estoy de acuerdo con mjlee en que Protocol Buffers de Google es un mejor forma de almacenar objetos que la forma de serialización original. Echa un vistazo y te encantará.

Me pregunto por qué nadie mencionó JSON y, por ejemplo, serializador Jackson JSON .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top