09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date:...

22
Programación Orientada a Objetos en C# .NET Ing. Bruno López Takeyas, M.C. http://www.itnuevolaredo.edu.mx/Takeyas 1 CAPÍTULO 9 SERIALIZACIÓN (ALMACENAMIENTO DE OBJETOS EN ARCHIVOS) 2 1 2

Transcript of 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date:...

Page 1: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 2: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 3: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 4: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 5: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 6: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 7: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 8: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 9: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 10: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 11: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 12: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 13: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 14: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 15: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 16: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 17: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 18: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 19: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 20: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 21: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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

Page 22: 09b.-Serializacion · 2020. 6. 14. · Title: 09b.-Serializacion Author: ISC Created Date: 6/13/2020 10:07:19 PM

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