Versión simplificada
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.io.* data class Persona(val nombre: String, val edad: Int) : Serializable fun serializarObjeto(objeto: Any, archivo: File) { ObjectOutputStream(FileOutputStream(archivo)).use { it.writeObject(objeto) } } fun deserializarObjeto(archivo: File): Any? { return ObjectInputStream(FileInputStream(archivo)).use { it.readObject() } } fun main() { val persona = Persona("Juan", 25) val archivo = File("persona.dat") // Serializar objeto serializarObjeto(persona, archivo) // Deserializar objeto val objetoDeserializado = deserializarObjeto(archivo) if (objetoDeserializado is Persona) { println("Nombre: ${objetoDeserializado.nombre}") println("Edad: ${objetoDeserializado.edad}") } } |
En esta versión, se utiliza el método use
en combinación con las funciones ObjectOutputStream
y ObjectInputStream
. Esto asegura que los recursos se cierren automáticamente una vez finalizada su utilización.
Además, se utilizan las funciones FileOutputStream
y FileInputStream
directamente dentro de las llamadas a ObjectOutputStream
y ObjectInputStream
, respectivamente, para evitar la necesidad de crear variables temporales.
En resumen, esta versión simplificada mantiene la funcionalidad original de serializar y deserializar un objeto almacenado en un archivo utilizando la interfaz Serializable
, pero con un código más conciso y menos líneas de código.
Versión sin simplificar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import java.io.* data class Persona(val nombre: String, val edad: Int) : Serializable fun serializarObjeto(objeto: Any, archivo: File) { val objetoSerializado = ByteArrayOutputStream() val objetoSalida = ObjectOutputStream(objetoSerializado) objetoSalida.writeObject(objeto) val bytes = objetoSerializado.toByteArray() objetoSalida.close() val archivoSalida = FileOutputStream(archivo) archivoSalida.write(bytes) archivoSalida.close() } fun deserializarObjeto(archivo: File): Any? { val bytes = archivo.readBytes() val objetoEntrada = ObjectInputStream(ByteArrayInputStream(bytes)) val objetoDeserializado = objetoEntrada.readObject() objetoEntrada.close() return objetoDeserializado } fun main() { val persona = Persona("Juan", 25) val archivo = File("persona.dat") // Serializar objeto serializarObjeto(persona, archivo) // Deserializar objeto val objetoDeserializado = deserializarObjeto(archivo) if (objetoDeserializado is Persona) { println("Nombre: ${objetoDeserializado.nombre}") println("Edad: ${objetoDeserializado.edad}") } } |
En este ejemplo, la clase Persona
implementa la interfaz Serializable
. Luego, la función serializarObjeto
recibe un objeto y un archivo como parámetros. Crea un flujo de salida de objetos y escribe el objeto en un flujo de bytes utilizando writeObject
. Luego, guarda los bytes en el archivo especificado.
La función deserializarObjeto
recibe un archivo y lee los bytes del archivo en un flujo de entrada de objetos. Utiliza readObject
para leer el objeto deserializado y lo devuelve.
En la función main
, creamos una instancia de Persona
, serializamos el objeto y luego lo deserializamos, imprimiendo sus propiedades si se pudo deserializar correctamente.
Ten en cuenta que al utilizar la interfaz Serializable
, debes asegurarte de que todas las propiedades de la clase y las clases relacionadas también sean serializables. Además, ten en cuenta que la serialización y deserialización de objetos puede tener implicaciones de seguridad y compatibilidad, especialmente cuando se trata de transferir objetos entre diferentes versiones o sistemas.