Programación Orientada a Objetos en C# .NET
CAPÍTULO 9
SERIALIZACIÓN
(ALMACENAMIENTO DE OBJETOS EN ARCHIVOS)
2
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
1
Programación Orientada a Objetos en C# .NET
Preguntas detonadoras
¿Qué es y para qué sirve la serialización?
¿Se pueden almacenar objetos en un archivo?
¿Cómo?
Serialización
Es el proceso para almacenar un
de
objeto
almacenamiento secundario.
dispositivo
en
un
Almacenar un objeto en un archivo
en el disco duro, memoria USB, CD,
etc.
3
4
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
2
Programación Orientada a Objetos en C# .NET
¿Para qué sirve la serialización?
Para transformar los datos y poder
de
archivo,
(internet,
canal
por
un
transferirlos
comunicación
memoria, etc.)
Para compartir información de un
sistema en otra aplicación.
Tipos de serialización en el
Framework .NET
Tipos de
serialización
• Binario
• SOAP
• XML
5
6
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
3
Programación Orientada a Objetos en C# .NET
¿Cómo preparar una clase para
serializar sus objetos?
Durante la serialización,
los atributos,
nombre de la clase y su ensamblado se
convierten en una secuencia de bytes.
Para serializar un objeto, su clase debe
declararse como [Serializable]
Ejemplo en UML
7
8
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
4
Programación Orientada a Objetos en C# .NET
Ejemplo codificado en C#
[Serializable]
class Empleado
{
// Atributos privados
…
// Propiedades públicas
…
}
9
Espacios de nombres requeridos
using System.IO; // Para el uso
de archivos
using
System.Runtime.Serialization.For
matters.Binary; // Para el uso
de la serialización
10
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
5
Programación Orientada a Objetos en C# .NET
Crear un archivo
Para grabar datos en un archivo, primero debe
crearse mediante:
Declaración
//
archivo
private System.IO.FileStream flujo;
del
flujo
del
// Creación del archivo
flujo = new FileStream(NombreArchivo,
FileMode.Create);
11
Serializar el archivo creado
Declaración
del
serializar el archivo
formateador
para
System.Runtime.Serialization.Formatters.Binary.Bina
ryFormatter seriador;
seriador = new BinaryFormatter();
12
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
6
Programación Orientada a Objetos en C# .NET
¿Cómo grabar un objeto en el
archivo serializado?
Almacena miObjeto en el
archivo
controlado por flujo
seriador.Serialize(flujo, miObjeto);
13
Cerrar el archivo
Una vez usado el archivo, entonces debe
cerrarse mediante:
if (flujo != null)
flujo.Close();
14
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
7
Programación Orientada a Objetos en C# .NET
Abrir un archivo en modo lectura
Para leer datos de un archivo, primero debe
abrirse mediante:
Declaración
//
archivo
private System.IO.FileStream flujo;
del
flujo
del
// Apertura del archivo
flujo = new FileStream(NombreArchivo,
FileMode.Open);
15
Serializar el archivo abierto en modo
lectura
Declaración
del
serializar el archivo
formateador
para
System.Runtime.Serialization.Formatters.Binary.Bina
ryFormatter seriador;
seriador = new BinaryFormatter();
16
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
8
Programación Orientada a Objetos en C# .NET
¿Cómo leer un objeto del archivo
serializado?
A este proceso se le conoce como
deserialización.
Lee miObjeto del archivo controlado por
flujo
miObjeto =
seriador.Deserialize(flujo);
17
Prototipar al leer un objeto
Al leer datos del archivo, debe indicarse el
tipo de dato
A este proceso se le conoce como
prototipar
miEmpleado = (Empleado)
seriador.Deserialize(flujo);
18
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
9
Programación Orientada a Objetos en C# .NET
Modos de apertura de archivos
(FileMode)
FileMode
Uso
CreateNew
Truncate
Create
Open
Crea un nuevo archivo. Si el archivo existe dispara una
IOException
Abrir un archivo existente. Una vez abierto, el archivo
será truncado a cero bytes de longitud.
Crea un nuevo archivo. Si el archivo existe será
sobreescrito.
Abrir un archivo existente. Si no existe dispara una
FileNotFoundException.
OpenOrCreate Abrir un archivo existente, si no existe, lo crea.
Append
Abrir un archivo para agregar datos al final en caso de
existir; de lo contrario crea un archivo nuevo.
Modos de acceso de archivos
(FileAccess)
FileAccess
Uso
Read
ReadWrite Acceso al archivo en modo de lectura y
Acceso al archivo en modo de solo lectura
Write
escritura
Acceso al archivo en modo de solo escritura
19
20
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
10
Programación Orientada a Objetos en C# .NET
¿Cómo detectar si existe un
archivo?
if (File.Exists(NombreArchivo))
{
……
}
21
Diseño de una clase para el
manejo de un archivo serializable
22
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
11
Programación Orientada a Objetos en C# .NET
Constructor
ArchivoSecuencialSerializadoBinario.ArchivoSecuencialSerializadoBinario(string strNombreArchivo)
NombreArchivo = strNombreArchivo
return
23
Destructor
ArchivoSecuencialSerializadoBinario. ~ArchivoSecuencialSerializadoBinario()
this.Cerrar()
return
24
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
12
Programación Orientada a Objetos en C# .NET
Método para crear el archivo
ArchivoSecuencialSerializadoBinario.Crear() : void
flujo = new FileStream(NombreArchivo, FileMode.Create)
seriador = new BinaryFormatter()
return
25
Método para abrir el archivo en
modo escritura
ArchivoSecuencialSerializadoBinario.AbrirEnModoEscritura() : void
FILE.Exists(NombreArchivo)
yes
flujo = new FileStream(NombreArchivo, FileMode.Append)
no
this.Crear()
return
seriador = new BinaryFormatter()
26
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
13
Programación Orientada a Objetos en C# .NET
Método para abrir el archivo en
modo lectura
ArchivoSecuencialSerializadoBinario.AbrirEnModoLectura() : void
FILE.Exists(NombreArchivo)
yes
flujo = new FileStream(NombreArchivo, FileMode.Open)
no
throw new Exception("No existe el archivo "+NombreArchivo)
seriador = new BinaryFormatter()
return
27
Método para abrir el archivo en
modo lectura y escritura
ArchivoSecuencialSerializadoBinario.AbrirEnModoLecturaYEscritura() : void
FILE.Exists(NombreArchivo)
yes
flujo = new FileStream(NombreArchivo, FileMode.Open, FileAccess.ReadWrite)
no
this.Crear()
seriador = new BinaryFormatter()
return
28
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
14
Programación Orientada a Objetos en C# .NET
Método para grabar un objeto en
el archivo
ArchivoSecuencialSerializadoBinario.GrabarObjeto(Tipo miObjeto) : void
seriador.Serialize(flujo, miObjeto)
return
Método para leer un objeto del
archivo
ArchivoSecuencialSerializadoBinario.LeerObjeto() : Tipo
Declarar miObjeto como Tipo
miObjeto = (Tipo) seriador.Deserialize(flujo)
return( miObjeto )
29
30
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
15
Programación Orientada a Objetos en C# .NET
Método para cerrar el archivo
ArchivoSecuencialSerializadoBinario.Cerrar() : void
flujo != null
yes
flujo.Close()
no
return
31
Declaración y creación del objeto
global para controlar el archivo
// Declaración y creación global de un objeto para el archivo
ArchivoSecuencialSerializadoBinario<Empleado> miArchivo
= new ArchivoSecuencialSerializadoBinario<Empleado>
("c:\\Datos\\Empleados.dat");
32
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
16
Programación Orientada a Objetos en C# .NET
private void btnAgregar_Click(object sender, EventArgs e)
{
¿Cómo grabar el objeto
miEmpleado en miArchivo?
// Declaración y creación de un objeto local para almacenar los datos del empleado
Empleado miEmpleado = new Empleado();
try
{
miEmpleado.Numero=int.Parse(txtNumero.Text);
miEmpleado.Nombre = txtNombre.Text;
miEmpleado.Sueldo = double.Parse(txtSueldo.Text);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
try
{
// Abrir el archivo para escribir en él
miArchivo.AbrirEnModoEscritura();
// Grabar el objeto
miArchivo.GrabarObjeto(miEmpleado);
MessageBox.Show("Datos almacenados correctamente !!!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
miArchivo.Cerrar();
}
// Mostrar los datos de los autos en el dataGridView
MostrarDatos();
}
void MostrarDatos()
{
¿Cómo grabar el objeto
miEmpleado en miArchivo?
// Declaración y creación de un objeto local
Empleado miEmpleado = new Empleado();
// Limpia el dataGridView
dgEmpleados.Rows.Clear();
try
{
// Abrir el archivo para leer
miArchivo.AbrirEnModoLectura();
while(true)
{
// Lee un objeto del archivo
miEmpleado = miArchivo.LeerObjeto();
// Muestra los datos del objeto leído en el dataGridView
dgEmpleados.Rows.Add(miEmpleado.Numero.ToString(), miEmpleado.Nombre,
miEmpleado.Sueldo.ToString(“C”));
}
}
catch (Exception ex)
{
}
finally
{
miArchivo.Cerrar();
}
}
33
34
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
17
Programación Orientada a Objetos en C# .NET
Otros títulos del autor
http://www.itnuevolaredo.edu.mx/Takeyas/Libro
[email protected]
Bruno López Takeyas
Ing. Bruno López Takeyas, M.C.
http://www.itnuevolaredo.edu.mx/Takeyas
18
Comentarios de: 09b.-Serialización - Programación Orientada a Objetos en C# (0)
No hay comentarios