09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date:...
Transcript of 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date:...
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 1
CAPÍTULO 9SERIALIZACIÓN
(ALMACENAMIENTO DE OBJETOS EN ARCHIVOS)
2
1
2
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 2
3
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 unobjeto en un dispositivo dealmacenamiento secundario.
�Almacenar un objeto en un archivoen el disco duro, memoria USB, CD,etc.
4
3
4
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 3
¿Para qué sirve la serialización?
�Para transformar los datos y podertransferirlos por un canal decomunicación (internet, archivo,memoria, etc.)
�Para compartir información de unsistema en otra aplicación.
5
Tipos de serialización en el Framework .NET
Tipos de serialización
• Binario
• SOAP
• XML
6
5
6
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 4
¿Cómo preparar una clase para serializar sus objetos?
�Durante la serialización, los atributos,nombre de la clase y su ensamblado seconvierten en una secuencia de bytes.
�Para serializar un objeto, su clase debedeclararse como [Serializable]
7
Ejemplo en UML
8
7
8
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 5
Ejemplo codificado en C#
9
[Serializable]
class Empleado
{
// Atributos privados
…
// Propiedades públicas
…
}
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
9
10
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 6
Crear un archivo�Para grabar datos en un archivo, primero debe
crearse mediante:
// Declaración del flujo del
archivo
private System.IO.FileStream flujo;
// Creación del archivo
flujo = new FileStream(NombreArchivo, FileMode.Create);
11
Serializar el archivo creado
�Declaración del formateador paraserializar el archivo
System.Runtime.Serialization.Formatters.Binary.Bina
ryFormatter seriador;
seriador = new BinaryFormatter();
12
11
12
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 7
¿Cómo grabar un objeto en el archivo serializado?
�Almacena miObjeto en el archivocontrolado por flujo
seriador.Serialize(flujo, miObjeto);
13
Cerrar el archivo
�Una vez usado el archivo, entonces debecerrarse mediante:
if (flujo != null)
flujo.Close();
14
13
14
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 8
Abrir un archivo en modo lectura�Para leer datos de un archivo, primero debe
abrirse mediante:
// Declaración del flujo del
archivo
private System.IO.FileStream flujo;
// Apertura del archivo
flujo = new FileStream(NombreArchivo, FileMode.Open);
15
Serializar el archivo abierto en modolectura
�Declaración del formateador paraserializar el archivo
System.Runtime.Serialization.Formatters.Binary.Bina
ryFormatter seriador;
seriador = new BinaryFormatter();
16
15
16
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 9
¿Cómo leer un objeto del archivoserializado?
�A este proceso se le conoce comodeserialización.
�Lee miObjeto del archivo controlado porflujo
miObjeto = seriador.Deserialize(flujo);
17
Prototipar al leer un objeto
�Al leer datos del archivo, debe indicarse eltipo de dato
�A este proceso se le conoce comoprototipar
miEmpleado = (Empleado) seriador.Deserialize(flujo);
18
17
18
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 10
Modos de apertura de archivos(FileMode)
19
FileMode Uso
CreateNew Crea un nuevo archivo. Si el archivo existe dispara una IOException
Truncate Abrir un archivo existente. Una vez abierto, el archivo será truncado a cero bytes de longitud.
Create Crea un nuevo archivo. Si el archivo existe será sobreescrito.
Open 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)
20
FileAccess Uso
Read Acceso al archivo en modo de solo lectura
ReadWrite Acceso al archivo en modo de lectura y escritura
Write Acceso al archivo en modo de solo escritura
19
20
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 11
Propiedades de un flujo de tipo FileStream
21
Propiedad Uso
Position Determina la posición del apuntador interno del archivo
Length Devuelve la longitud en bytes del archivo
¿Cómo detectar si existe un archivo?
if (File.Exists(NombreArchivo))
{
……
}
22
21
22
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 12
Diseño de una clase (versión básica)
23
Recomendaciones
� La propiedad NombreArchivo presente un nivelasimétrico:� get – público
� set – privado
�Definir el método Crear() de acceso privado
� Incluir una propiedad pública de sólo lecturapara determinar si se alcanza el final del archivo(FinArchivo). Devuelve true si alcanza el finaldel archivo o false en caso contrario
24
23
24
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 13
25
Constructor
ArchivoSecuencialSerializadoBinario.ArchivoSecuencialSerializadoBinario(string strNombreArchivo)
NombreArchivo = strNombreArchivo
return
26
Destructor
ArchivoSecuencialSerializadoBinario. ~ArchivoSecuencialSerializadoBinario()
return
this.Cerrar()
25
26
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 14
27
Método para crear el archivo
ArchivoSecuencialSerializadoBinario.Crear() : void
return
flujo = new FileStream(NombreArchivo, FileMode.Create)
seriador = new BinaryFormatter()
Se recomienda que este método sea privado (aunque puede ser público y depende del nivel de acceso deseado)
28
Método para abrir el archivo en modo escritura
ArchivoSecuencialSerializadoBinario.AbrirEnModoEscritura() : void
return
FILE.Exists(NombreArchivo) flujo = new FileStream(NombreArchivo, FileMode.Append)yes
this.Crear()
no
seriador = new BinaryFormatter()
27
28
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 15
29
Método para abrir el archivo en modo lectura
ArchivoSecuencialSerializadoBinario.AbrirEnModoLectura() : void
return
FILE.Exists(NombreArchivo) flujo = new FileStream(NombreArchivo, FileMode.Open)yes
no
seriador = new BinaryFormatter() throw new Exception("No existe el archivo "+NombreArchivo)
30
Método para abrir el archivo en modo lectura y escritura
ArchivoSecuencialSerializadoBinario.AbrirEnModoLecturaYEscritura() : void
return
FILE.Exists(NombreArchivo)yes
no
flujo = new FileStream(NombreArchivo, FileMode.Open, FileAccess.ReadWrite)
this.Crear()
seriador = new BinaryFormatter()
29
30
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 16
31
Método para grabar un objeto en el archivo
ArchivoSecuencialSerializadoBinario.GrabarObjeto(Tipo miObjeto) : void
return
seriador.Serialize(flujo, miObjeto)
32
Método para leer un objeto del archivo
ArchivoSecuencialSerializadoBinario.LeerObjeto() : Tipo
return( miObjeto )
Declarar miObjeto como Tipo
miObjeto = (Tipo) seriador.Deserialize(flujo)
31
32
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 17
33
Propiedad de sólo lectura paradeterminar si se alcanza el final delarchivo
34
Método para cerrar el archivo
ArchivoSecuencialSerializadoBinario.Cerrar() : void
flujo != null flujo.Close()yes
return
no
33
34
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 18
35
Método para eliminar el archivo
36
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");
35
36
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 19
37
Método independiente para capturar un objeto y grabarlo en un archivo
38
¿Cómo grabar el objeto miEmpleado en miArchivo?
private void btnAgregar_Click(object sender, EventArgs e)
{
// 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 {
miArchivo.AbrirEnModoEscritura(); // Abrir el archivo para escribir
miArchivo.GrabarObjeto(miEmpleado); // Grabar el objeto
MessageBox.Show("Datos almacenados correctamente !!!");
}
catch(Exception ex) {
MessageBox.Show(ex.Message);
}
finally {
miArchivo.Cerrar();
}
MostrarDatos(); // Mostrar los datos de los autos en el dataGridView
}
37
38
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 20
39
Método independiente para recorrer el archivo y mostrar sus datos
40
private void MostrarDatos()
{
Empleado miEmpleado = new Empleado(); // Declaración y creación del objeto
dgEmpleados.Rows.Clear(); // Limpia el dataGridView
try {
miArchivo.AbrirEnModoLectura(); // Abrir el archivo para leer
while(!miArchivo.FinArchivo) { // Mientras NO alcance el fin del archivo
miEmpleado = miArchivo.LeerObjeto(); // Lee un objeto del archivo
// 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) {
MessageBox.Show(ex.Message);
}
finally {
miArchivo.Cerrar();
}
}
39
40
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 21
41
Método independiente para contar los registros (objetos) almacenados en el archivo
42
private int ContarRegistros()
{
Empleado miEmpleado = new Empleado(); // Declaración y creación del objeto
int intContador = 0; // Declaración del contador
try {
miArchivo.AbrirEnModoLectura(); // Abrir el archivo para leer
while(!miArchivo.FinArchivo) { // Mientras NO sea el fin del archivo
miEmpleado = miArchivo.LeerObjeto(); // Lee un objeto del archivo
intContador++; // Se incrementa el contador
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
finally {
miArchivo.Cerrar(); // Cierra el archivo
}
return( intContador ); // Devuelve el contador
}
41
42
Programación Orientada a Objetos en C# .NET
Ing. Bruno López Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 22
Otros títulos del autor
http://www.itnuevolaredo.edu.mx/Takeyas/Libro
Bruno López [email protected]
43