SlideShare una empresa de Scribd logo
1 de 51
Índice Gestionando el sistema de archivos Leyendo y escribiendo datos mediante Streams Compresión y protección de datos mediante Streams Ampliando la seguridad de las aplicaciones utilizando almacenamiento aislado. Serialización y Deserialización de objetos mediante Runtime Serialization Personalización de los procesos de RuntimeSerialization y Deserialization Serialización y Deserialización de objetos como datos XML Todas las aplicaciones, excepto las más triviales, requieren algún tipo de entrada o salida de datos y, en muchos casos, se efectúa contra archivos. .NET Framework nos provee de un conjunto de clases que nos permiten acceder al sistema de archivos del sistema, navegar por las carpetas, crear y eliminas archivos y leer y escribir en los mismos, implementado mediante un modelo de streaming.  Adicionalmente podemos encriptar y comprimir los datos al almacenarlos en un archivo o en memoria. Aunque dado que la gestión de datos en memoria tiene sus limitaciones .NET nos suministra el almacenamiento aislado, para ayudarnos a persistir los datos privados a disco, peor protegidos de programas maliciosos. Esta técnica nos permite asignar un espacio de archivos para un usuario, aplicación o ensamblado, el cual será independiente de cualquier otro usuario, aplicación o ensamblado. Gestión de archivos y Serialización
Gestionando el sistema de archivos Las clases File y FileInfo del espacio de nombres  System.IO Leer mediante la clase File Las clases Directory yDirectoryInfo  La clase DriveInfo  Información de ruta de archivos y carpetas Monitorizar cambios en archivos o carpetas Gestión de archivos y Serialización
Gestión de archivos y Serialización Las clases File y FileInfo Clase File FileInfo class Provee métodos de instancia. Recibe el nombre de archivo como parámetros en el constructor. Tiene propiedades para modificar atributos. Comprueba la autorización en cada llamada Se puede utilizar para realizar mútiples operaciones con un archivo Provee métodos estáticos static (Shared)  Recibe el nombre de archivo como un parámetro Tiene métodos para modificar atributos Comprueba la autorización del usuario en cada llamada a método Se puede utilizar para ejecutar una operación aislada con un archivo. Create Delete Exists Encrypt Copy/CopyTo Move/MoveTo Replace Decrypt using System.IO; ... File.Copy(@"E:emocodeyFile.txt", @"E:emocodeopyFile.txt", true); File.SetAttributes(@"E:emocodeopyFile.txt",  		FileAttributes.ReadOnly | FileAttributes.Hidden); using System.IO; … FileInfo dataFileInfo = new FileInfo(@"E:emocodeyFile.txt"); dataFileInfo.CopyTo(@"E:emocodeopyFile.txt", true); FileInfo copyFileInfo = new FileInfo(@"E:emocodeopyFile.txt"); copyFileInfo.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden;
Leer y escribir con la clase File Gestión de archivos y Serialización ReadAllBytes ReadAllLines ReadAllText WriteAllBytes WriteAllLines WriteAllText AppendAllText
Las clases Directory y DirectoryInfo Gestión de archivos y Serialización La clase Directory La clase DirectoryInfo Provee métodos estáticos static (Shared) Recibe el nombre de carpeta como parámetro Incluye métodos que no están disponibles con la clase DirectoryInfo Puede usarse para ejecutar una operación aislada con una carpeta Provee métodos de instancia Recibe el nombre de carpeta en el constructor Incluye el método CreateSubdirectoryque no está en la clase Directory Se usa para ejecutar múltiples operaciones con una carpeta CreateDirectory/Create GetDirectories GetFileSystemEntries/ GetFileSystemInfos Delete Move/MoveTo Exists GetFiles
Gestión de archivos y Serialización Las clases Directory y DirectoryInfo Directory class Imports System.IO ... Dim currentFolder As String currentFolder = Directory.GetCurrentDirectory() Dim fileAndFolderNames() As String fileAndFolderNames = Directory.GetFileSystemEntries(currentFolder) For Each entry As String In fileAndFolderNames Console.WriteLine("{0}", entry) Next entry DirectoryInfo class Dim backupFolder As New DirectoryInfo("E:emocodeackup") If Not backupFolder.Exists Then backupFolder.Create() End If Dim currentFolderName As String currentFolderName = Directory.GetCurrentDirectory() Dim currentFolder As New DirectoryInfo(currentFolderName) For Each entry As FileInfo In currentFolder.GetFiles() entry.CopyTo(backupFolder.FullName + "quot; + entry.Name) Next entry
La clase DriveInfo Gestión de archivos y Serialización Provee métodos y propiedades para recuperar información de dispositivos Soporta discos fijos y portátiles, CD/DVD, diskettes y discos de red GetDrives IsReady AvailableFreeSpace DriveFormat DriveType RootDirectory TotalFreeSpace TotalSize VolumeLabel
Obtener información de la ruta de archivos y carpetas Gestión de archivos y Serialización La clase Path Provee campos y métodos estáticos static (Shared) que permiten trocear nombres de archivo y carpetas Siendo consciente de las capacidades y limitaciones del sistema de archivos Tiene métodos para la generación de nombres de archivo únicos y temporales: GetTempFileName , GetRandomFileName  GetDirectoryName GetFileName GetPathRoot E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt GetExtension DirectorySeparator VolumeSeparator
Monitorizar cambios en archivos o carpetas Gestión de archivos y Serialización La clase FileSystemWatcher Monitoriza una carpeta y genera un evento si cambia un archivo o sub-carpeta 1 Crear un objeto FileSystemWatcher Fijar la propiedad Path en la carpeta a monitorizar Fijar las propiedades Filter y NotifyFilter para indicar los cambios a monitorizar Informar la propiedadIncludeSubDirectory Manejar los eventos Created, Changed,Deleted yRenamed Fijar la propiedad EnableRaisingEvents a True 2 3 4 5 6 Filter: *.txt NotifyFilter: Filename Deleted Created Changed Renamed
Leer y escribir datos mediante Streams ¿Qué es un Stream de entrada / salida? La clase FileStream Leer y escribir texto en un Stream Leer y escribir texto binario en un Stream Leer y escribir datos temporales en memoria ¿Cómo añadir buffering a un StreamUnbuffered La clase File nos suministra métodos static o Shared para efectuar lecturas y escrituras básicas en archivos. Sin embargo las aplicaciones deben efectuar, normalmente, accesos a los datos más selectivos. .NET Framework implementa un modelo de Streaming que podemos utilizar para acceder a los datos contenidos en los archivos. Algunos de estos Streams permiten accede aleatorio, lo cual habilita la búsqueda de valores concretos para localizar la posición inicial y leer a partir de ahí o la inserción d datos en posiciones distintas del final de archivo. Gestión de archivos y Serialización
¿Qué es un Stream de entrada/salida? Gestión de archivos y Serialización Un flujo de datos desde un origen a un destino mediante un único canal. Los daos se reciben en el orden en el que se envían. La clase Stream(utilizada mediante FileStream o MemoryStream) Es la clase base par todos los Streams de .NET. Implementa métodos y propiedades que manejan un Stream como una serie de bytes (ReDimwithSetLength). Provee soporte para acceso aleatorio. Utiliza el soporte de hardware, cuando está disponible, para grandes cantidades de datos. Utiliza un puntero interno a la ubicación de los datos en origen. Read Flush Seek ReadByte CanRead Close Write CanWrite Length CanSeek WriteByte Position
La clase FileStream Gestión de archivos y Serialización Es una implementación de la clase Stream para la lectura y escritura de archivos. Se especifica la ruta, el archivo, el modo de apertura, el tipo de acceso, el tamaño de buffer y el acceso compartido en el constructor. Read bytes Write bytes FileStream
Gestión de archivos y Serialización La clase FileStream using System.IO; byte[] firstMessage = newbyte[] { Convert.ToByte('H'), Convert.ToByte('o'),             Convert.ToByte('l'), Convert.ToByte('l'), Convert.ToByte('a') }; byte[] secondMessage = newbyte[] { Convert.ToByte(' '), Convert.ToByte('M'),             Convert.ToByte('u'), Convert.ToByte('n'), Convert.ToByte('d'),             Convert.ToByte('o') }; using (FileStream file = new FileStream(@"E:emocodereetings.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { file.Lock(0, firstMessage.Length + secondMessage.Length); file.Write(firstMessage, 0, firstMessage.Length); file.Write(secondMessage, 0, secondMessage.Length); file.Unlock(0, firstMessage.Length + secondMessage.Length); file.Seek(-3, SeekOrigin.End); byte[] dataRead = new byte[3]; file.Read(dataRead, 0, dataRead.Length); Console.WriteLine("Final 3 bytes: {0}{1}{2}",Convert.ToChar(dataRead[0]),        	Convert.ToChar(dataRead[1]), Convert.ToChar(dataRead[2])); file.Close(); } ,[object Object],[object Object]
Gestión de archivos y Serialización Leer y escribir texto en un Stream using System.IO; ... string customerName = "John"; int customerAge = 43; string customerNationality = "British"; string data = ""; using (StreamWriter writer = new StreamWriter(@"E:emocodeustomers.txt")) { writer.WriteLine("Customer Name: {0}", customerName); writer.WriteLine("Age: {0}", customerAge); writer.WriteLine("Nationality: {0}", customerNationality); writer.Close(); } using (StreamReader reader = new StreamReader(@"E:emocodeustomers.txt")) { data = reader.ReadLine(); Console.WriteLine("{0}", data); data = reader.ReadLine(); Console.WriteLine("{0}", data); data = reader.ReadLine(); Console.WriteLine("{0}", data); reader.Close(); } Customer Name: John Age: 43 Nationality: British
Leer y escribir datos binarios en un Stream Gestión de archivos y Serialización Las clases BinaryReadery BinaryWriter Convierten entre tipos de .NET Framework y Stream de bytes Dispone de métodos para leer y escribir tipos primitivos Read/WriteChar Read binary data Read/WriteInt32 Read/WriteString BinaryReader Read/WriteDouble FileStream … Write binary data BinaryWriter
Leer y escribir datos temporales en memoria Gestión de archivos y Serialización La clase MemoryStream Es una implementación de la clase Stream que accede a la memoria. Incluye métodos que copian datos a un Array u otro Stream. Puede utilizarse con objetos Binary/StreamReadery Binary/StreamWriter para leer y escribir datos de texto o binarios. Similar a FileStream pero almacenando en memoria. ToArray Read binary/text data WriteTo Binary/StreamReader MemoryStream Write binary/text data Binary/StreamWriter
Como añadir Buffering a un Stream Unbuffered Gestión de archivos y Serialización La clase BufferedStream Añade almacenamiento temporal a un Stream que no disponga de él (Stream, NetworkStream o streams personalizados). Actúa como un wrapper arropando un Streamunbuffered Implementa métodos de Stream, pero los datos se almacenan temporalmente hasta que se lancen los métodos Flush o Close o el buffer esté lleno. Se debe especificar el tamaño del buffer en el constructor. Flush BufferedStream Unbuffered Stream
Compresión y protección de datos mediante Streams La clase DeflateStream para compresión de datos. La clase GZipStream para compresión de datos. La clase CryptoStream para encriptado de datos. El modelo de streaming permite también que las aplicaciones transformen los datos que están siendo leídos o escritos de un archivo y .NET dispone de clases que pueden comprimir y encriptar los datos a medida que se procesan. Estas características son muy útiles si se quiere reducir el espacio ocupado por un archivo o protege rel contenido del mismo de miradas indiscretas. Gestión de archivos y Serialización
La clase DeflateStream para compresión de datos Gestión de archivos y Serialización Comprime y descomprime los datos de un Stream de bytes Implementa el algoritmo Deflate No soporta acceso aleatorio produciendo una excepción NotSupportedException Reside en el espacio de nombre System.IO.Compression El tamaño máximo de Stream es de 4 Gb. DeflateStream
Gestión de archivos y Serialización La clase DeflateStream para compresión de datos using System.IO; using System.IO.Compression; // Datos a comprimir string[] data = new string[] { "En un lugar de ola mancha", "de cuyo nombre no me quiero acordar", "vivia, no ha mucho un caballero.."}; // Compone un stream para escribir y comprimir using (FileStream file = new FileStream(@"E:emocodeompressedData.dat", FileMode.Create, FileAccess.Write))  { using (DeflateStream deflate = new DeflateStream(file,CompressionMode.Compress)) { StreamWriter writer = new StreamWriter(deflate); // Escribe los datos en el stream comprimido foreach (string item in data)  { writer.WriteLine(item); } 	writer.Close(); } }
La clase GZipStream para compresión de datos Gestión de archivos y Serialización Comprime y descomprime datos en un Stream de bytes Implementa el algoritmo Deflate Formatea los datos según la especificación GZIP(Gzip, WinZip, WinRar) GZipStream
La clase CryptoStream para encriptado de datos Gestión de archivos y Serialización Encripta y desencripta datos en un Stream de bytes Aplica una transformación criptográfica especificada por un objeto ICryptoTransform .NET incluye varios proveedores de servicios criptográficos y el espacio de nombres System.Security.Cryptography CryptoStream ICryptoTransform Object
Gestión de archivos y Serialización using System.IO;  using System.Security.Cryptography;  string[] data = new string[] { "Top", "Secret", "Data" };  FileStream fileWriter = new FileStream(@"E:emocodeecretData.bin", FileMode.Create, FileAccess.Write);   // Especifica la encriptación DES y genera la clave y el vector DESCryptoServiceProvider dcspWriter = new DESCryptoServiceProvider();  dcspWriter.GenerateKey();  dcspWriter.GenerateIV();   byte[] key = dcspWriter.Key; // Salva la clave byte[] vector = dcspWriter.IV; // Salva el vector // Crea un CryptoStream y encripta los datos ICryptoTransform transformWriter = dcspWriter.CreateEncryptor();  CryptoStream cryptoWriter = new CryptoStream(fileWriter, transformWriter, CryptoStreamMode.Write);  StreamWriter writer = new StreamWriter(cryptoWriter);   foreach (string item in data) {      writer.WriteLine(item);  }  writer.Close();   using System.IO;  using System.Security.Cryptography;  // Lee y desencripta los datos FileStream fileReader = new FileStream(@"E:emocodeecretData.bin", FileMode.Open, FileAccess.Read);  DESCryptoServiceProvider dcspReader = new DESCryptoServiceProvider();  ICryptoTransform transformReader = dcspReader.CreateDecryptor(key, vector);  CryptoStream cryptoReader = new CryptoStream(fileReader, transformReader, CryptoStreamMode.Read);  StreamReader reader = new StreamReader(cryptoReader);   string line = reader.ReadLine();  while (line != null) {      Console.WriteLine("{0}", line);      line = reader.ReadLine();  }  reader.Close();
Ampliando la seguridad de las aplicaciones utilizando almacenamiento aislado ¿Qué es el almacenamiento aislado? ¿Cómo gestionar archivos y carpetas en almacenamiento aislado? ¿Cómo leer y escribir archivos en almacenamiento aislado? Muy a menudo las aplicaciones deben crear archivos temporales o de configuración de usuario, los cuales pueden contener información sensible. Para pequeñas cantidades de datos que tengan un periodo de vida muy corto, podemos mantener esta información en memoria. Pero no siempre es éste el mejor enfoque para ello. Adicionalmente, podemos querer retener esta información entre ejecuciones de la aplicación. Sin embargo, hay varios consideraciones a tener en cuenta: ,[object Object]
Si la información es confidencial, está claro que no querremos que se almacene en una ubicación genérica, a la disposición de todo el que acceda al ordenador.
De la misma forma, si hay varios ensamblados corriendo en le máquina, es posible que no deseemos que el resto de ensamblados puedan acceder a dicha información. Sobre todo para aquellos procesos descargados de la red..NET Framework dispone del IsolatedStorage para ayudarnos a solucionar estos problemas. Gestión de archivos y Serialización
¿Qué es el almacenamiento aislado? Gestión de archivos y Serialización Es un almacenamiento de archivos privativo de un ensamblado y completamente aislado del reservado para otros ensamblados. Isolated storage Los ensamblados sólo requieren el permiso  IsolatedStorageFilePermission para crear y acceder al almacenamiento aislado. Privilegios Ámbito del almacenamiento aislado Isolated storage está compuesto de almacenes gestionados en compartimientos de datos ,[object Object]
También hay compartimientos a nivel de máquina
Cada ensamblado tiene su propio almacén en un compartimiento de datosDiferentes ensamblados no pueden acceder fácilmente al almacén de otro. ,[object Object],Las aplicaciones ClickOnce pueden crear almacenes a nivel de aplicación
¿Cómo gestionar archivos y carpetas en  almacenamiento aislado? Gestión de archivos y Serialización La clase IsolatedStorageFile Implementa un sistema de archivos en almacenamiento aislado Dispone de métodos para crear y acceder un almacén de IsolatedStorage con un ámbito específico. Contiene métodos para crear y gestionar archivos y carpetas en un almacén IsolatedStorage CreateDirectory GetStore DeleteDirectory GetUserStoreForAssembly GetDirectoryNames GetUserStoreForDomain DeleteFile GetUserStoreForApplication GetFileNames GetMachineStoreForAssembly Remove GetMachineStoreForDomain Close GetMachineStoreForApplication
Gestión de archivos y Serialización ¿Cómo gestionar archivos y carpetas en  almacenamiento aislado? using System;  using System.IO;  using System.IO.IsolatedStorage;  // Crea una serie de carpetas IsolatedStorageFileisolatedStorage =IsolatedStorageFile.GetUserStoreForDomain();  isolatedStorage.CreateDirectory("PrivateFolder1");  isolatedStorage.CreateDirectory("PrivateFolder2");  isolatedStorage.CreateDirectory("PrivateFolder3");  isolatedStorage.CreateDirectory("TestFolder");  isolatedStorage.Close();  // Lista las carpetas  IsolatedStorageFileisolatedStorage = IsolatedStorageFile.GetUserStoreForDomain();  string[] foldernames = isolatedStorage.GetDirectoryNames("Private*");  foreach (string name in foldernames)  {      Console.WriteLine("{0}", name);  }  isolatedStorage.Close();  // la salida debería parecerse a esto PrivateFolder1  PrivateFolder2  PrivateFolder3
¿Cómo leer y escribir archivos en  almacenamiento aislado? Gestión de archivos y Serialización La clase IsolatedStorageFileStream Es una clase FileStream para crear, leer y escribir archivos en IsolatedStorage Se utiliza con objetos Binary / StreamReadery Binary / StreamWriter para leer y escribir datos de texto y binarios Se utiliza con objetos DeflateStreamo GZipStream y CryptoStream para comprimir y encriptar datos Read binary/text data Binary/StreamReader IsolatedStorageFileStream Write binary/text data Binary/StreamWriter
Gestión de archivos y Serialización ¿Cómo leer y escribir archivos en  almacenamiento aislado? using System; using System.IO; using System.IO.IsolatedStorage; // Crea un archivo en almacenamiento aislado string[] data = new string[] { "Private", "User", "Data" }; IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForDomain(); isolatedStorage.CreateDirectory("Demodata"); IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(@"Demodatarivate.txt", FileMode.Create, FileAccess.Write, isolatedStorage); StreamWriter writer = new StreamWriter(fileStream); foreach (string item in data) { writer.WriteLine(item); } writer.Close(); isolatedStorage.Close(); // Lee el archivo IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForDomain(); IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(@"Demodatarivate.txt", FileMode.Open, FileAccess.Read, isolatedStorage); StreamReader reader = new StreamReader(fileStream); string line = reader.ReadLine(); while (line != null) { Console.WriteLine("{0}", line); line = reader.ReadLine(); } reader.Close(); isolatedStorage.Close(); The output of this code resembles the following example when it is run on the LON-DEV-05 virtual machine.  Private  User  Data
Serialización y Deserialización Serialización y deserialización de objetos mediante serialización en tiempo de ejecución Personalización de los procesos de serialización y deserialización Serialización y deserialización de objetos como datos XML Las clasesStreamReader, StreamWriter, BinaryReader y BinaryWriter de la BCL nos permiten construir aplicaciones que pueden leer y escribir texto y tipos primitivos de datos utilizando Streams. Sin embargo, en muchos casos es necesario leer y escribir estructuras de datos definidas por nuestras propias clases y estructuras. Además, es posible que deseemos emitir estos datos en un formato diferente al de la codificación estándar que implementen dichas clases, por ejemplo en XML. El proceso de convertir objetos en un formato que pueda ser escrito en un Stream se llama serialización. Y el proceso inverso de conversión desde un Stream a objetos se llama deserialización. Gestión de archivos y Serialización
Serialización y Deserialización de objetos utilizando Runtime Serialization El proceso de serialización Cómo definir un tipo serializable. El proceso de deserialización Como serializa y deserializa los tipos complejos y las colecciones .NET Cuando serializamos un objeto, éste es convertido en una serie de bytes, que después se envían a un Stream. El cuál puede apuntar  a un almacenamiento persistente, a una dirección de red o hacia algún otro destino. Gestión de archivos y Serialización
El proceso de serialización Gestión de archivos y Serialización El proceso de convertir un objeto en una serie de bytes Serialización Serialización en tiempo de ejecución Las clases BinaryFormatter(.NET) y SoapFormatter controlan el formato e serialización(Espacios de nombres System.Runtime.Serialization.Formatters.Binary y System.Runtime.Serialization.Formatters.Soap) ,[object Object],Los objetos a serializar:  ,[object Object]
Pueden implementar el interfaz ISerializableGetObjectData Serialize Binary Deserialize Serialize SOAP Objeto serializable Deserialize
Gestión de archivos y Serialización El proceso de serialización using System.Runtime.Serialization.Formatters.Soap; using System.IO; string message = "The cost of product 99 is:"; decimal price = 149.99M; using (FileStream fileStream = new FileStream(@"E:emocodeoapData.txt",FileMode.OpenOrCreate, FileAccess.Write)) { SoapFormatter soapFormatter = new SoapFormatter(); soapFormatter.Serialize(fileStream, message); soapFormatter.Serialize(fileStream, price); soapFormatter.Serialize(fileStream, String.Format("{0} {1}", message, price)); fileStream.Close(); } <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=“http://schemas.xmlsoap.org/soap/envelope/”  xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <SOAP-ENC:string id="ref-1">The cost of product 99 is:</SOAP-ENC:string> </SOAP-ENV:Body> </SOAP-ENV:Envelope> <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <xsd:decimal id="ref-1"> <flags>131072</flags> <hi>0</hi> <lo>14999</lo> <mid>0</mid> </xsd:decimal> </SOAP-ENV:Body> </SOAP-ENV:Envelope> <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=“http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <SOAP-ENC:string id="ref-1">The cost of product 99 is: 149.99</SOAP-ENC:string> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
¿Cómo definir un tipo serializable? Gestión de archivos y Serialización Aquél marcado con el atributo System.SerializableAttribute Tipo serializable Tipos serializables Todos los campos de instancia se serializan (no static/shared): ,[object Object],Para omitir un campo hay que marcarlo con el atributo NonSerializedAttribute Los tipos de clases base también han de ser serializables Serializable BankCustomer Serializable FirstName Person LastName NonSerialized password NonSerialized creditCardPin bankAccountNumber
Gestión de archivos y Serialización ¿Cómo definir un tipo serializable? using System.Runtime.Serialization.Formatters.Soap; using System.IO; using System; ... [Serializable] class Data { privatestring privateData = "This is private data"; public string publicData = "This is public data"; [NonSerialized] private string  otherPrivateData = " This data will not be serialized" } ... Data data = new Data(); using (FileStream fileStream = new FileStream(@"E:emocodeoapData.txt",FileMode.OpenOrCreate, FileAccess.Write)) { SoapFormatter soapFormatter = new SoapFormatter(); soapFormatter.Serialize(fileStream, data); fileStream.Close(); } <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd="http://www.w3. org/2001/XMLSchema" xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV= “http://schemas.xmlsoap.org/soap/envelope/”xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0"  SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">     <SOAP-ENV:Body>         <a1:Data id="ref-1”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SerializationVB/         SerializationVB%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">             <privateData id="ref-3">This is private data</privateData>             <publicData id="ref-4">This is public data</publicData>         </a1:Data>     </SOAP-ENV:Body> </SOAP-ENV:Envelope>
El proceso de deserialización Gestión de archivos y Serialización El proceso de construir un objeto a partir de una serie de bytes Deserialización Deserializando datos Llamar al método Deserialize del objeto formatter Asegurarse de que la información del tipo en el stream de serialización es compatible con la versión del objeto en deserialización Utilizar el atributo OptionalFieldAttribute o un binder para solventar los problemas de versiones Deserialize AccountData AccountNumber OptionalField DateOpened Binder Balance Formatter
Como serializa y deserializa .NET los tipos complejos y las colecciones Gestión de archivos y Serialización Serializando y deserializando dependencias Person Formattergenera Ids de referencia El Stream de serialización referencia los objetos mediante esos Ids Formatterutiliza ObjectManager para resolver las dependencias de objetos en la deserialización Y ejecuta inicializaciones adicionales implementando el interfaz IDeserializationCallback Name [string] Father [Person] Mother [Person] Name: Francesca 3 Father: John Mother: Diana Serialize Ref: 1  Name: John Ref: 2 Name: Diana Ref: 3 Name: Francesca Father: 1 Mother: 2 Name: John 1 Formatter Object Manager 2 Name: Diana Deserialize
Gestión de archivos y Serialización Como serializa y deserializa .NET los tipos complejos y las colecciones <Serializable()> Class Person Public Name As String Public Father As Person Public Mother As Person End Class Dim mum As New Person() mum.Name = "Diana" Dim dad As New Person() dad.Name = "John" Dim daughter As New Person() daughter.Name = "Francesca" daughter.Mother = mum daughter.Father = dad Using serializationStream AsNew FileStream("E:emocodeaughter.txt", FileMode.Create, FileAccess.Write) Dim soapWriter As New SoapFormatter() soapWriter.Serialize(serializationStream, daughter) serializationStream.Close() End Using <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns: SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=“http://schemas.xmlsoap.org/soap/envelope/”xmlns:clr="http:// schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:Person id="ref-1”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0 %2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <Name id="ref-3">Francesca</Name> <Father href="#ref-4"/> <Mother href="#ref-5"/> </a1:Person> <a1:Person id="ref-4”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0 %2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <Name id="ref-6">John</Name> <Father xsi:null="1"/> <Mother xsi:null="1"/> </a1:Person> <a1:Person id="ref-5”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0 %2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <Name id="ref-7">Diana</Name> <Father xsi:null="1"/> <Mother xsi:null="1"/> </a1:Person> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Personalización de la serialización en tiempo de ejecución Personalizando el proceso de serialización Personalizando el proceso de deserialización Implementación de la clase Custom Formatter Gestión de archivos y Serialización
Personalizando el proceso de serialización Gestión de archivos y Serialización Interfaz ISerializable  Implementa el método GetObjectData Alimenta el parámetro SerializationInfo al ser llamado con el método Serialize Eventos de serialización Utiliza el atributo OnSerializingAttribute para marcar un método que se ejecuta antes de que comience la serialización Utiliza el atributo OnSerializedAttribute para marcar un método que se ejecuta cuando la serialización se ha completado Serialize CustomClass GetObjectData OnSerializing Serializing SerializationInfo OnSerialized Serialized Formatter
Personalizando el proceso de deserialización Gestión de archivos y Serialización Requerimientos de una clase personalizada Requiere un constructor de deserialización Alimentar el objeto con los datos del parámetro SerializationInfo Eventos de deserialización Utilizar el atributo OnDeserializingAttribute para marcar un método para que se ejecute antes de que comience la deserialización Y OnDeserializedAttribute para otro método cuando se haya completado CustomClass Deserialize SerializationInfo Deserialization Constructor Deserializing OnDeserializing Deserialized OnDeserialized Formatter
Implementación de la clase Custom Formatter Gestión de archivos y Serialización Implementar IFormatter.Serialize Si el objeto implementa ISerializable, llamar GetObjectData Utilizar la clase de apoyo FormatterServices para recuperar los miembros a serializar Escribir los metadatos del objetos y sus datos al Stream de serialización Utilizar la clase de apoyo SerializationObjectManager para lanzar los eventos de serialización Implementar IFormatter.Deserialize Leer el Stream de serialización y extraer los metadatos y datos Utilizar la clase de apoyo FormatterServices para crear una instancia vacía del objeto Si el objeto dispone de un constructor de deserialización, llamarlo para alimentar al objeto, en caso contrario, cumplimentar la información en el método Deserialize Utilizar un objeto ObjectManager para gestionar las referencias y lanzar los eventos
Serialización y deserialización de objetos como datos XML Cómo serializar un objeto como XML Como la clase XmlSerializer serializa datos complejos Como especificar definición de tipos XML y espacios de nombres Como controlar la serialización XML para un tipo Personalización del proceso de serialización XML Como deserializar  un objeto desde un Stream XML Gestión de archivos y Serialización
Cómo serializar un objeto como XML Gestión de archivos y Serialización Uso de la clase XmlSerializer  Crear  un objeto XmlSerializer y especificar el tipo de objeto a serializar Llamar al método Serialize y enviar los datos a un objeto Stream, TextWritero XmlWriter Requerimientos de un tipo serializable Debe ser un tipo público No necesita el atributo Serializable Debe disponer de un constructor por defecto público (para deserializar) Debe tener acceso público a los campos y propiedades que contiene los datos a serializar Serializable <?xml version="1.0"> <BankCustomer xmlns:xsi="... "  >     <CustomerName>Fred</CustomerName> </BankCustomer> Public BankCustomer BankCustomer() CustomerName creditCardPin
Gestión de archivos y Serialización Cómo serializar un objeto como XML using System.Xml.Serialization; publicclass OrderInfo { public string OrderId; public DateTime OrderDate; public decimal Cost; internal int ProfitPercent = 75; } ... OrderInfo order = new OrderInfo(); order.OrderId = "Order1"; order.OrderDate = DateTime.Now; order.Cost = 10.99M; XmlSerializer serializer = new XmlSerializer(typeof(OrderInfo)); FileStream xmlStream = new FileStream(@"E:emocoderder.xml", FileMode.Create,  	FileAccess.Write); serializer.Serialize(xmlStream, order); xmlStream.Close(); <?xml version="1.0"?> <OrderInfo xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 	xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <OrderId>Order1</OrderId> <Orderdate>2008-04-01T09:39:13.9010496-08:00</Orderdate> <Cost>10.99</Cost> </OrderInfo>
Cómo serializa datos complejos la clase XmlSerializer Gestión de archivos y Serialización Serialización de objetos complejos El formato XML representa las relaciones entre objetos como una estructura jerárquica de datos. Múltiples referencias generan datos duplicados. Serialización de colecciones de objetos Hay que especificar el tipo de los objetos de la colección al crear el objeto XmlSerializer desde el espacio de nombres System.Xml.Serialization <?xml version="1.0"?> <ArrayOfAnyType xmlns:xsi=“...">    <anyType xsi:type="Person">       <Name>Diana</Name>       <Id>2</Id>    </anyType>    <anyType xsi:type="Person">       <Name>John</Name>       <Id>1</Id>    </anyType>    <anyType xsi:type="Person">       <Name>Francesca</Name>       <Id>3</Id>       <Father>          <Name>John</Name>          <Id>2</Id>       </Father>       <Mother>          <Name>Diana</Name>          <Id>1</Id>       </Mother>    </anyType> </ArrayOfAnyType> <?xml version="1.0"?><Person xmlns:xsi="... " >   <Name>Francesca</Name>   <Id>3</Id>   <Father>      <Name>John</Name>      <Id>1</Id>   </Father>   <Mother>       <Name>Diana</Name>      <Id>2</Id>   </Mother> </Person>

Más contenido relacionado

La actualidad más candente

Estructura De Dominios Y Active Directory
Estructura De Dominios Y Active DirectoryEstructura De Dominios Y Active Directory
Estructura De Dominios Y Active Directorykarivip
 
Estructura de Dominios y Active Directory en Windows 2003 Server
Estructura de Dominios y Active Directory en Windows 2003 ServerEstructura de Dominios y Active Directory en Windows 2003 Server
Estructura de Dominios y Active Directory en Windows 2003 ServerLeonid Valenzuela
 
Comando ls - metacaracteres
Comando ls - metacaracteresComando ls - metacaracteres
Comando ls - metacaracteresPablo Macon
 
Dominios En Windows 2003 Server
Dominios En Windows 2003 ServerDominios En Windows 2003 Server
Dominios En Windows 2003 ServerDean1506
 
CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008
CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008
CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008belenduca
 
Administracion de archivos
Administracion de archivosAdministracion de archivos
Administracion de archivoscgviviana
 
Active directory
Active directoryActive directory
Active directoryleidy
 
Tema 3 Ficheros Y Permisos
Tema 3 Ficheros Y PermisosTema 3 Ficheros Y Permisos
Tema 3 Ficheros Y PermisosFresyMetal
 
Guia Basica Directorio Activo, Domain Controller y Exchange
Guia Basica Directorio Activo, Domain Controller y ExchangeGuia Basica Directorio Activo, Domain Controller y Exchange
Guia Basica Directorio Activo, Domain Controller y ExchangeJulian Molano Grautoff
 

La actualidad más candente (13)

Exposicion
ExposicionExposicion
Exposicion
 
Estructura De Dominios Y Active Directory
Estructura De Dominios Y Active DirectoryEstructura De Dominios Y Active Directory
Estructura De Dominios Y Active Directory
 
Estructura de Dominios y Active Directory en Windows 2003 Server
Estructura de Dominios y Active Directory en Windows 2003 ServerEstructura de Dominios y Active Directory en Windows 2003 Server
Estructura de Dominios y Active Directory en Windows 2003 Server
 
Comando ls - metacaracteres
Comando ls - metacaracteresComando ls - metacaracteres
Comando ls - metacaracteres
 
Dominios En Windows 2003 Server
Dominios En Windows 2003 ServerDominios En Windows 2003 Server
Dominios En Windows 2003 Server
 
CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008
CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008
CONCEPTOS SOBRE DOMINIOS CREADOS CON WINDOWS SERVER 2008
 
Administracion de archivos
Administracion de archivosAdministracion de archivos
Administracion de archivos
 
Active directory
Active directoryActive directory
Active directory
 
Tema 3 Ficheros Y Permisos
Tema 3 Ficheros Y PermisosTema 3 Ficheros Y Permisos
Tema 3 Ficheros Y Permisos
 
Active directory
Active directoryActive directory
Active directory
 
Guia Basica Directorio Activo, Domain Controller y Exchange
Guia Basica Directorio Activo, Domain Controller y ExchangeGuia Basica Directorio Activo, Domain Controller y Exchange
Guia Basica Directorio Activo, Domain Controller y Exchange
 
Active directory
Active directoryActive directory
Active directory
 
Active directory
Active directoryActive directory
Active directory
 

Similar a Framework .NET 3.5 14 Gestión de archivos y serialización

Similar a Framework .NET 3.5 14 Gestión de archivos y serialización (20)

PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
 
Flujos y archivo en java
Flujos y archivo en javaFlujos y archivo en java
Flujos y archivo en java
 
Bryan gordillo ensayo_ficheros
Bryan gordillo ensayo_ficherosBryan gordillo ensayo_ficheros
Bryan gordillo ensayo_ficheros
 
Bryan gordillo ensayo_ficheros
Bryan gordillo ensayo_ficherosBryan gordillo ensayo_ficheros
Bryan gordillo ensayo_ficheros
 
Metodos de entrada y Salida
Metodos de entrada y SalidaMetodos de entrada y Salida
Metodos de entrada y Salida
 
Sistema de archivos
Sistema de archivosSistema de archivos
Sistema de archivos
 
Sistema de Archivos
Sistema de ArchivosSistema de Archivos
Sistema de Archivos
 
Lab archivos
Lab archivosLab archivos
Lab archivos
 
Archivos C++
Archivos C++Archivos C++
Archivos C++
 
Flujos y archivos
Flujos y archivosFlujos y archivos
Flujos y archivos
 
Flujos de bytes y cadenas
Flujos de bytes y cadenasFlujos de bytes y cadenas
Flujos de bytes y cadenas
 
Gestionde fichero
Gestionde ficheroGestionde fichero
Gestionde fichero
 
Fichero
FicheroFichero
Fichero
 
Gestión de Almacenamiento
Gestión de AlmacenamientoGestión de Almacenamiento
Gestión de Almacenamiento
 
Controladora de perifericos
Controladora de perifericos Controladora de perifericos
Controladora de perifericos
 
Controladora de perifericos indice
Controladora de perifericos indiceControladora de perifericos indice
Controladora de perifericos indice
 
Acceso a datos
Acceso a datosAcceso a datos
Acceso a datos
 
Grupo nro4ficheros
Grupo nro4ficherosGrupo nro4ficheros
Grupo nro4ficheros
 
Archivo logico
Archivo logicoArchivo logico
Archivo logico
 
Archivos 15
Archivos 15Archivos 15
Archivos 15
 

Más de Antonio Palomares Sender

Framework .NET 3.5 15 Configuración y despliegue de soluciones
Framework .NET 3.5 15 Configuración y despliegue de solucionesFramework .NET 3.5 15 Configuración y despliegue de soluciones
Framework .NET 3.5 15 Configuración y despliegue de solucionesAntonio Palomares Sender
 
Framework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la redFramework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la redAntonio Palomares Sender
 
Framework .NET 3.5 12 Uso de system.drawing
Framework .NET 3.5 12 Uso de system.drawingFramework .NET 3.5 12 Uso de system.drawing
Framework .NET 3.5 12 Uso de system.drawingAntonio Palomares Sender
 
Framework .NET 3.5 09 Depuración, monitorización y pruebas
Framework .NET 3.5 09 Depuración, monitorización y pruebasFramework .NET 3.5 09 Depuración, monitorización y pruebas
Framework .NET 3.5 09 Depuración, monitorización y pruebasAntonio Palomares Sender
 
Framework .NET 3.5 08 Validación de datos
Framework .NET 3.5 08 Validación de datosFramework .NET 3.5 08 Validación de datos
Framework .NET 3.5 08 Validación de datosAntonio Palomares Sender
 
Framework .NET 3.5 07 Programación orientada a objetos
Framework .NET 3.5 07 Programación orientada a objetosFramework .NET 3.5 07 Programación orientada a objetos
Framework .NET 3.5 07 Programación orientada a objetosAntonio Palomares Sender
 
Framework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netFramework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netAntonio Palomares Sender
 
Framework .NET 3.5 05 Tipo y jerarquía de objetos
Framework .NET 3.5 05 Tipo y jerarquía de objetosFramework .NET 3.5 05 Tipo y jerarquía de objetos
Framework .NET 3.5 05 Tipo y jerarquía de objetosAntonio Palomares Sender
 
Framework .NET 3.5 04 El common language runtime
Framework .NET 3.5 04 El common language runtimeFramework .NET 3.5 04 El common language runtime
Framework .NET 3.5 04 El common language runtimeAntonio Palomares Sender
 
Framework .NET 3.5 02 Entorno de desarrollo (ide)
Framework .NET 3.5 02 Entorno de desarrollo (ide)Framework .NET 3.5 02 Entorno de desarrollo (ide)
Framework .NET 3.5 02 Entorno de desarrollo (ide)Antonio Palomares Sender
 
Framework .NET 3.5 01 Conceptos básicos y entorno
Framework .NET 3.5 01 Conceptos básicos y entornoFramework .NET 3.5 01 Conceptos básicos y entorno
Framework .NET 3.5 01 Conceptos básicos y entornoAntonio Palomares Sender
 

Más de Antonio Palomares Sender (13)

Framework .NET 3.5 15 Configuración y despliegue de soluciones
Framework .NET 3.5 15 Configuración y despliegue de solucionesFramework .NET 3.5 15 Configuración y despliegue de soluciones
Framework .NET 3.5 15 Configuración y despliegue de soluciones
 
Framework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la redFramework .NET 3.5 13 Programación orientada a la red
Framework .NET 3.5 13 Programación orientada a la red
 
Framework .NET 3.5 12 Uso de system.drawing
Framework .NET 3.5 12 Uso de system.drawingFramework .NET 3.5 12 Uso de system.drawing
Framework .NET 3.5 12 Uso de system.drawing
 
Framework .NET 3.5 11 Seguridad
Framework .NET 3.5 11 SeguridadFramework .NET 3.5 11 Seguridad
Framework .NET 3.5 11 Seguridad
 
Framework .NET 3.5 10 Linq
Framework .NET 3.5 10 LinqFramework .NET 3.5 10 Linq
Framework .NET 3.5 10 Linq
 
Framework .NET 3.5 09 Depuración, monitorización y pruebas
Framework .NET 3.5 09 Depuración, monitorización y pruebasFramework .NET 3.5 09 Depuración, monitorización y pruebas
Framework .NET 3.5 09 Depuración, monitorización y pruebas
 
Framework .NET 3.5 08 Validación de datos
Framework .NET 3.5 08 Validación de datosFramework .NET 3.5 08 Validación de datos
Framework .NET 3.5 08 Validación de datos
 
Framework .NET 3.5 07 Programación orientada a objetos
Framework .NET 3.5 07 Programación orientada a objetosFramework .NET 3.5 07 Programación orientada a objetos
Framework .NET 3.5 07 Programación orientada a objetos
 
Framework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netFramework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .net
 
Framework .NET 3.5 05 Tipo y jerarquía de objetos
Framework .NET 3.5 05 Tipo y jerarquía de objetosFramework .NET 3.5 05 Tipo y jerarquía de objetos
Framework .NET 3.5 05 Tipo y jerarquía de objetos
 
Framework .NET 3.5 04 El common language runtime
Framework .NET 3.5 04 El common language runtimeFramework .NET 3.5 04 El common language runtime
Framework .NET 3.5 04 El common language runtime
 
Framework .NET 3.5 02 Entorno de desarrollo (ide)
Framework .NET 3.5 02 Entorno de desarrollo (ide)Framework .NET 3.5 02 Entorno de desarrollo (ide)
Framework .NET 3.5 02 Entorno de desarrollo (ide)
 
Framework .NET 3.5 01 Conceptos básicos y entorno
Framework .NET 3.5 01 Conceptos básicos y entornoFramework .NET 3.5 01 Conceptos básicos y entorno
Framework .NET 3.5 01 Conceptos básicos y entorno
 

Último

FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 

Último (20)

FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 

Framework .NET 3.5 14 Gestión de archivos y serialización

  • 1. Índice Gestionando el sistema de archivos Leyendo y escribiendo datos mediante Streams Compresión y protección de datos mediante Streams Ampliando la seguridad de las aplicaciones utilizando almacenamiento aislado. Serialización y Deserialización de objetos mediante Runtime Serialization Personalización de los procesos de RuntimeSerialization y Deserialization Serialización y Deserialización de objetos como datos XML Todas las aplicaciones, excepto las más triviales, requieren algún tipo de entrada o salida de datos y, en muchos casos, se efectúa contra archivos. .NET Framework nos provee de un conjunto de clases que nos permiten acceder al sistema de archivos del sistema, navegar por las carpetas, crear y eliminas archivos y leer y escribir en los mismos, implementado mediante un modelo de streaming. Adicionalmente podemos encriptar y comprimir los datos al almacenarlos en un archivo o en memoria. Aunque dado que la gestión de datos en memoria tiene sus limitaciones .NET nos suministra el almacenamiento aislado, para ayudarnos a persistir los datos privados a disco, peor protegidos de programas maliciosos. Esta técnica nos permite asignar un espacio de archivos para un usuario, aplicación o ensamblado, el cual será independiente de cualquier otro usuario, aplicación o ensamblado. Gestión de archivos y Serialización
  • 2. Gestionando el sistema de archivos Las clases File y FileInfo del espacio de nombres System.IO Leer mediante la clase File Las clases Directory yDirectoryInfo La clase DriveInfo Información de ruta de archivos y carpetas Monitorizar cambios en archivos o carpetas Gestión de archivos y Serialización
  • 3. Gestión de archivos y Serialización Las clases File y FileInfo Clase File FileInfo class Provee métodos de instancia. Recibe el nombre de archivo como parámetros en el constructor. Tiene propiedades para modificar atributos. Comprueba la autorización en cada llamada Se puede utilizar para realizar mútiples operaciones con un archivo Provee métodos estáticos static (Shared) Recibe el nombre de archivo como un parámetro Tiene métodos para modificar atributos Comprueba la autorización del usuario en cada llamada a método Se puede utilizar para ejecutar una operación aislada con un archivo. Create Delete Exists Encrypt Copy/CopyTo Move/MoveTo Replace Decrypt using System.IO; ... File.Copy(@"E:emocodeyFile.txt", @"E:emocodeopyFile.txt", true); File.SetAttributes(@"E:emocodeopyFile.txt", FileAttributes.ReadOnly | FileAttributes.Hidden); using System.IO; … FileInfo dataFileInfo = new FileInfo(@"E:emocodeyFile.txt"); dataFileInfo.CopyTo(@"E:emocodeopyFile.txt", true); FileInfo copyFileInfo = new FileInfo(@"E:emocodeopyFile.txt"); copyFileInfo.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden;
  • 4. Leer y escribir con la clase File Gestión de archivos y Serialización ReadAllBytes ReadAllLines ReadAllText WriteAllBytes WriteAllLines WriteAllText AppendAllText
  • 5. Las clases Directory y DirectoryInfo Gestión de archivos y Serialización La clase Directory La clase DirectoryInfo Provee métodos estáticos static (Shared) Recibe el nombre de carpeta como parámetro Incluye métodos que no están disponibles con la clase DirectoryInfo Puede usarse para ejecutar una operación aislada con una carpeta Provee métodos de instancia Recibe el nombre de carpeta en el constructor Incluye el método CreateSubdirectoryque no está en la clase Directory Se usa para ejecutar múltiples operaciones con una carpeta CreateDirectory/Create GetDirectories GetFileSystemEntries/ GetFileSystemInfos Delete Move/MoveTo Exists GetFiles
  • 6. Gestión de archivos y Serialización Las clases Directory y DirectoryInfo Directory class Imports System.IO ... Dim currentFolder As String currentFolder = Directory.GetCurrentDirectory() Dim fileAndFolderNames() As String fileAndFolderNames = Directory.GetFileSystemEntries(currentFolder) For Each entry As String In fileAndFolderNames Console.WriteLine("{0}", entry) Next entry DirectoryInfo class Dim backupFolder As New DirectoryInfo("E:emocodeackup") If Not backupFolder.Exists Then backupFolder.Create() End If Dim currentFolderName As String currentFolderName = Directory.GetCurrentDirectory() Dim currentFolder As New DirectoryInfo(currentFolderName) For Each entry As FileInfo In currentFolder.GetFiles() entry.CopyTo(backupFolder.FullName + "quot; + entry.Name) Next entry
  • 7. La clase DriveInfo Gestión de archivos y Serialización Provee métodos y propiedades para recuperar información de dispositivos Soporta discos fijos y portátiles, CD/DVD, diskettes y discos de red GetDrives IsReady AvailableFreeSpace DriveFormat DriveType RootDirectory TotalFreeSpace TotalSize VolumeLabel
  • 8. Obtener información de la ruta de archivos y carpetas Gestión de archivos y Serialización La clase Path Provee campos y métodos estáticos static (Shared) que permiten trocear nombres de archivo y carpetas Siendo consciente de las capacidades y limitaciones del sistema de archivos Tiene métodos para la generación de nombres de archivo únicos y temporales: GetTempFileName , GetRandomFileName GetDirectoryName GetFileName GetPathRoot E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt E:emocodeestFolderestFile.txt GetExtension DirectorySeparator VolumeSeparator
  • 9. Monitorizar cambios en archivos o carpetas Gestión de archivos y Serialización La clase FileSystemWatcher Monitoriza una carpeta y genera un evento si cambia un archivo o sub-carpeta 1 Crear un objeto FileSystemWatcher Fijar la propiedad Path en la carpeta a monitorizar Fijar las propiedades Filter y NotifyFilter para indicar los cambios a monitorizar Informar la propiedadIncludeSubDirectory Manejar los eventos Created, Changed,Deleted yRenamed Fijar la propiedad EnableRaisingEvents a True 2 3 4 5 6 Filter: *.txt NotifyFilter: Filename Deleted Created Changed Renamed
  • 10. Leer y escribir datos mediante Streams ¿Qué es un Stream de entrada / salida? La clase FileStream Leer y escribir texto en un Stream Leer y escribir texto binario en un Stream Leer y escribir datos temporales en memoria ¿Cómo añadir buffering a un StreamUnbuffered La clase File nos suministra métodos static o Shared para efectuar lecturas y escrituras básicas en archivos. Sin embargo las aplicaciones deben efectuar, normalmente, accesos a los datos más selectivos. .NET Framework implementa un modelo de Streaming que podemos utilizar para acceder a los datos contenidos en los archivos. Algunos de estos Streams permiten accede aleatorio, lo cual habilita la búsqueda de valores concretos para localizar la posición inicial y leer a partir de ahí o la inserción d datos en posiciones distintas del final de archivo. Gestión de archivos y Serialización
  • 11. ¿Qué es un Stream de entrada/salida? Gestión de archivos y Serialización Un flujo de datos desde un origen a un destino mediante un único canal. Los daos se reciben en el orden en el que se envían. La clase Stream(utilizada mediante FileStream o MemoryStream) Es la clase base par todos los Streams de .NET. Implementa métodos y propiedades que manejan un Stream como una serie de bytes (ReDimwithSetLength). Provee soporte para acceso aleatorio. Utiliza el soporte de hardware, cuando está disponible, para grandes cantidades de datos. Utiliza un puntero interno a la ubicación de los datos en origen. Read Flush Seek ReadByte CanRead Close Write CanWrite Length CanSeek WriteByte Position
  • 12. La clase FileStream Gestión de archivos y Serialización Es una implementación de la clase Stream para la lectura y escritura de archivos. Se especifica la ruta, el archivo, el modo de apertura, el tipo de acceso, el tamaño de buffer y el acceso compartido en el constructor. Read bytes Write bytes FileStream
  • 13.
  • 14. Gestión de archivos y Serialización Leer y escribir texto en un Stream using System.IO; ... string customerName = "John"; int customerAge = 43; string customerNationality = "British"; string data = ""; using (StreamWriter writer = new StreamWriter(@"E:emocodeustomers.txt")) { writer.WriteLine("Customer Name: {0}", customerName); writer.WriteLine("Age: {0}", customerAge); writer.WriteLine("Nationality: {0}", customerNationality); writer.Close(); } using (StreamReader reader = new StreamReader(@"E:emocodeustomers.txt")) { data = reader.ReadLine(); Console.WriteLine("{0}", data); data = reader.ReadLine(); Console.WriteLine("{0}", data); data = reader.ReadLine(); Console.WriteLine("{0}", data); reader.Close(); } Customer Name: John Age: 43 Nationality: British
  • 15. Leer y escribir datos binarios en un Stream Gestión de archivos y Serialización Las clases BinaryReadery BinaryWriter Convierten entre tipos de .NET Framework y Stream de bytes Dispone de métodos para leer y escribir tipos primitivos Read/WriteChar Read binary data Read/WriteInt32 Read/WriteString BinaryReader Read/WriteDouble FileStream … Write binary data BinaryWriter
  • 16. Leer y escribir datos temporales en memoria Gestión de archivos y Serialización La clase MemoryStream Es una implementación de la clase Stream que accede a la memoria. Incluye métodos que copian datos a un Array u otro Stream. Puede utilizarse con objetos Binary/StreamReadery Binary/StreamWriter para leer y escribir datos de texto o binarios. Similar a FileStream pero almacenando en memoria. ToArray Read binary/text data WriteTo Binary/StreamReader MemoryStream Write binary/text data Binary/StreamWriter
  • 17. Como añadir Buffering a un Stream Unbuffered Gestión de archivos y Serialización La clase BufferedStream Añade almacenamiento temporal a un Stream que no disponga de él (Stream, NetworkStream o streams personalizados). Actúa como un wrapper arropando un Streamunbuffered Implementa métodos de Stream, pero los datos se almacenan temporalmente hasta que se lancen los métodos Flush o Close o el buffer esté lleno. Se debe especificar el tamaño del buffer en el constructor. Flush BufferedStream Unbuffered Stream
  • 18. Compresión y protección de datos mediante Streams La clase DeflateStream para compresión de datos. La clase GZipStream para compresión de datos. La clase CryptoStream para encriptado de datos. El modelo de streaming permite también que las aplicaciones transformen los datos que están siendo leídos o escritos de un archivo y .NET dispone de clases que pueden comprimir y encriptar los datos a medida que se procesan. Estas características son muy útiles si se quiere reducir el espacio ocupado por un archivo o protege rel contenido del mismo de miradas indiscretas. Gestión de archivos y Serialización
  • 19. La clase DeflateStream para compresión de datos Gestión de archivos y Serialización Comprime y descomprime los datos de un Stream de bytes Implementa el algoritmo Deflate No soporta acceso aleatorio produciendo una excepción NotSupportedException Reside en el espacio de nombre System.IO.Compression El tamaño máximo de Stream es de 4 Gb. DeflateStream
  • 20. Gestión de archivos y Serialización La clase DeflateStream para compresión de datos using System.IO; using System.IO.Compression; // Datos a comprimir string[] data = new string[] { "En un lugar de ola mancha", "de cuyo nombre no me quiero acordar", "vivia, no ha mucho un caballero.."}; // Compone un stream para escribir y comprimir using (FileStream file = new FileStream(@"E:emocodeompressedData.dat", FileMode.Create, FileAccess.Write)) { using (DeflateStream deflate = new DeflateStream(file,CompressionMode.Compress)) { StreamWriter writer = new StreamWriter(deflate); // Escribe los datos en el stream comprimido foreach (string item in data) { writer.WriteLine(item); } writer.Close(); } }
  • 21. La clase GZipStream para compresión de datos Gestión de archivos y Serialización Comprime y descomprime datos en un Stream de bytes Implementa el algoritmo Deflate Formatea los datos según la especificación GZIP(Gzip, WinZip, WinRar) GZipStream
  • 22. La clase CryptoStream para encriptado de datos Gestión de archivos y Serialización Encripta y desencripta datos en un Stream de bytes Aplica una transformación criptográfica especificada por un objeto ICryptoTransform .NET incluye varios proveedores de servicios criptográficos y el espacio de nombres System.Security.Cryptography CryptoStream ICryptoTransform Object
  • 23. Gestión de archivos y Serialización using System.IO; using System.Security.Cryptography; string[] data = new string[] { "Top", "Secret", "Data" }; FileStream fileWriter = new FileStream(@"E:emocodeecretData.bin", FileMode.Create, FileAccess.Write); // Especifica la encriptación DES y genera la clave y el vector DESCryptoServiceProvider dcspWriter = new DESCryptoServiceProvider(); dcspWriter.GenerateKey(); dcspWriter.GenerateIV(); byte[] key = dcspWriter.Key; // Salva la clave byte[] vector = dcspWriter.IV; // Salva el vector // Crea un CryptoStream y encripta los datos ICryptoTransform transformWriter = dcspWriter.CreateEncryptor(); CryptoStream cryptoWriter = new CryptoStream(fileWriter, transformWriter, CryptoStreamMode.Write); StreamWriter writer = new StreamWriter(cryptoWriter); foreach (string item in data) { writer.WriteLine(item); } writer.Close(); using System.IO; using System.Security.Cryptography; // Lee y desencripta los datos FileStream fileReader = new FileStream(@"E:emocodeecretData.bin", FileMode.Open, FileAccess.Read); DESCryptoServiceProvider dcspReader = new DESCryptoServiceProvider(); ICryptoTransform transformReader = dcspReader.CreateDecryptor(key, vector); CryptoStream cryptoReader = new CryptoStream(fileReader, transformReader, CryptoStreamMode.Read); StreamReader reader = new StreamReader(cryptoReader); string line = reader.ReadLine(); while (line != null) { Console.WriteLine("{0}", line); line = reader.ReadLine(); } reader.Close();
  • 24.
  • 25. Si la información es confidencial, está claro que no querremos que se almacene en una ubicación genérica, a la disposición de todo el que acceda al ordenador.
  • 26. De la misma forma, si hay varios ensamblados corriendo en le máquina, es posible que no deseemos que el resto de ensamblados puedan acceder a dicha información. Sobre todo para aquellos procesos descargados de la red..NET Framework dispone del IsolatedStorage para ayudarnos a solucionar estos problemas. Gestión de archivos y Serialización
  • 27.
  • 28. También hay compartimientos a nivel de máquina
  • 29.
  • 30. ¿Cómo gestionar archivos y carpetas en almacenamiento aislado? Gestión de archivos y Serialización La clase IsolatedStorageFile Implementa un sistema de archivos en almacenamiento aislado Dispone de métodos para crear y acceder un almacén de IsolatedStorage con un ámbito específico. Contiene métodos para crear y gestionar archivos y carpetas en un almacén IsolatedStorage CreateDirectory GetStore DeleteDirectory GetUserStoreForAssembly GetDirectoryNames GetUserStoreForDomain DeleteFile GetUserStoreForApplication GetFileNames GetMachineStoreForAssembly Remove GetMachineStoreForDomain Close GetMachineStoreForApplication
  • 31. Gestión de archivos y Serialización ¿Cómo gestionar archivos y carpetas en almacenamiento aislado? using System; using System.IO; using System.IO.IsolatedStorage; // Crea una serie de carpetas IsolatedStorageFileisolatedStorage =IsolatedStorageFile.GetUserStoreForDomain(); isolatedStorage.CreateDirectory("PrivateFolder1"); isolatedStorage.CreateDirectory("PrivateFolder2"); isolatedStorage.CreateDirectory("PrivateFolder3"); isolatedStorage.CreateDirectory("TestFolder"); isolatedStorage.Close(); // Lista las carpetas IsolatedStorageFileisolatedStorage = IsolatedStorageFile.GetUserStoreForDomain(); string[] foldernames = isolatedStorage.GetDirectoryNames("Private*"); foreach (string name in foldernames) { Console.WriteLine("{0}", name); } isolatedStorage.Close(); // la salida debería parecerse a esto PrivateFolder1 PrivateFolder2 PrivateFolder3
  • 32. ¿Cómo leer y escribir archivos en almacenamiento aislado? Gestión de archivos y Serialización La clase IsolatedStorageFileStream Es una clase FileStream para crear, leer y escribir archivos en IsolatedStorage Se utiliza con objetos Binary / StreamReadery Binary / StreamWriter para leer y escribir datos de texto y binarios Se utiliza con objetos DeflateStreamo GZipStream y CryptoStream para comprimir y encriptar datos Read binary/text data Binary/StreamReader IsolatedStorageFileStream Write binary/text data Binary/StreamWriter
  • 33. Gestión de archivos y Serialización ¿Cómo leer y escribir archivos en almacenamiento aislado? using System; using System.IO; using System.IO.IsolatedStorage; // Crea un archivo en almacenamiento aislado string[] data = new string[] { "Private", "User", "Data" }; IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForDomain(); isolatedStorage.CreateDirectory("Demodata"); IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(@"Demodatarivate.txt", FileMode.Create, FileAccess.Write, isolatedStorage); StreamWriter writer = new StreamWriter(fileStream); foreach (string item in data) { writer.WriteLine(item); } writer.Close(); isolatedStorage.Close(); // Lee el archivo IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForDomain(); IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(@"Demodatarivate.txt", FileMode.Open, FileAccess.Read, isolatedStorage); StreamReader reader = new StreamReader(fileStream); string line = reader.ReadLine(); while (line != null) { Console.WriteLine("{0}", line); line = reader.ReadLine(); } reader.Close(); isolatedStorage.Close(); The output of this code resembles the following example when it is run on the LON-DEV-05 virtual machine. Private User Data
  • 34. Serialización y Deserialización Serialización y deserialización de objetos mediante serialización en tiempo de ejecución Personalización de los procesos de serialización y deserialización Serialización y deserialización de objetos como datos XML Las clasesStreamReader, StreamWriter, BinaryReader y BinaryWriter de la BCL nos permiten construir aplicaciones que pueden leer y escribir texto y tipos primitivos de datos utilizando Streams. Sin embargo, en muchos casos es necesario leer y escribir estructuras de datos definidas por nuestras propias clases y estructuras. Además, es posible que deseemos emitir estos datos en un formato diferente al de la codificación estándar que implementen dichas clases, por ejemplo en XML. El proceso de convertir objetos en un formato que pueda ser escrito en un Stream se llama serialización. Y el proceso inverso de conversión desde un Stream a objetos se llama deserialización. Gestión de archivos y Serialización
  • 35. Serialización y Deserialización de objetos utilizando Runtime Serialization El proceso de serialización Cómo definir un tipo serializable. El proceso de deserialización Como serializa y deserializa los tipos complejos y las colecciones .NET Cuando serializamos un objeto, éste es convertido en una serie de bytes, que después se envían a un Stream. El cuál puede apuntar a un almacenamiento persistente, a una dirección de red o hacia algún otro destino. Gestión de archivos y Serialización
  • 36.
  • 37. Pueden implementar el interfaz ISerializableGetObjectData Serialize Binary Deserialize Serialize SOAP Objeto serializable Deserialize
  • 38. Gestión de archivos y Serialización El proceso de serialización using System.Runtime.Serialization.Formatters.Soap; using System.IO; string message = "The cost of product 99 is:"; decimal price = 149.99M; using (FileStream fileStream = new FileStream(@"E:emocodeoapData.txt",FileMode.OpenOrCreate, FileAccess.Write)) { SoapFormatter soapFormatter = new SoapFormatter(); soapFormatter.Serialize(fileStream, message); soapFormatter.Serialize(fileStream, price); soapFormatter.Serialize(fileStream, String.Format("{0} {1}", message, price)); fileStream.Close(); } <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=“http://schemas.xmlsoap.org/soap/envelope/” xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <SOAP-ENC:string id="ref-1">The cost of product 99 is:</SOAP-ENC:string> </SOAP-ENV:Body> </SOAP-ENV:Envelope> <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <xsd:decimal id="ref-1"> <flags>131072</flags> <hi>0</hi> <lo>14999</lo> <mid>0</mid> </xsd:decimal> </SOAP-ENV:Body> </SOAP-ENV:Envelope> <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=“http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <SOAP-ENC:string id="ref-1">The cost of product 99 is: 149.99</SOAP-ENC:string> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
  • 39.
  • 40. Gestión de archivos y Serialización ¿Cómo definir un tipo serializable? using System.Runtime.Serialization.Formatters.Soap; using System.IO; using System; ... [Serializable] class Data { privatestring privateData = "This is private data"; public string publicData = "This is public data"; [NonSerialized] private string otherPrivateData = " This data will not be serialized" } ... Data data = new Data(); using (FileStream fileStream = new FileStream(@"E:emocodeoapData.txt",FileMode.OpenOrCreate, FileAccess.Write)) { SoapFormatter soapFormatter = new SoapFormatter(); soapFormatter.Serialize(fileStream, data); fileStream.Close(); } <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd="http://www.w3. org/2001/XMLSchema" xmlns:SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV= “http://schemas.xmlsoap.org/soap/envelope/”xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:Data id="ref-1”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SerializationVB/ SerializationVB%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <privateData id="ref-3">This is private data</privateData> <publicData id="ref-4">This is public data</publicData> </a1:Data> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
  • 41. El proceso de deserialización Gestión de archivos y Serialización El proceso de construir un objeto a partir de una serie de bytes Deserialización Deserializando datos Llamar al método Deserialize del objeto formatter Asegurarse de que la información del tipo en el stream de serialización es compatible con la versión del objeto en deserialización Utilizar el atributo OptionalFieldAttribute o un binder para solventar los problemas de versiones Deserialize AccountData AccountNumber OptionalField DateOpened Binder Balance Formatter
  • 42. Como serializa y deserializa .NET los tipos complejos y las colecciones Gestión de archivos y Serialización Serializando y deserializando dependencias Person Formattergenera Ids de referencia El Stream de serialización referencia los objetos mediante esos Ids Formatterutiliza ObjectManager para resolver las dependencias de objetos en la deserialización Y ejecuta inicializaciones adicionales implementando el interfaz IDeserializationCallback Name [string] Father [Person] Mother [Person] Name: Francesca 3 Father: John Mother: Diana Serialize Ref: 1 Name: John Ref: 2 Name: Diana Ref: 3 Name: Francesca Father: 1 Mother: 2 Name: John 1 Formatter Object Manager 2 Name: Diana Deserialize
  • 43. Gestión de archivos y Serialización Como serializa y deserializa .NET los tipos complejos y las colecciones <Serializable()> Class Person Public Name As String Public Father As Person Public Mother As Person End Class Dim mum As New Person() mum.Name = "Diana" Dim dad As New Person() dad.Name = "John" Dim daughter As New Person() daughter.Name = "Francesca" daughter.Mother = mum daughter.Father = dad Using serializationStream AsNew FileStream("E:emocodeaughter.txt", FileMode.Create, FileAccess.Write) Dim soapWriter As New SoapFormatter() soapWriter.Serialize(serializationStream, daughter) serializationStream.Close() End Using <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns: SOAPENC=“http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAPENV=“http://schemas.xmlsoap.org/soap/envelope/”xmlns:clr="http:// schemas.microsoft.com/soap/encoding/clr/1.0" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:Person id="ref-1”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0 %2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <Name id="ref-3">Francesca</Name> <Father href="#ref-4"/> <Mother href="#ref-5"/> </a1:Person> <a1:Person id="ref-4”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0 %2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <Name id="ref-6">John</Name> <Father xsi:null="1"/> <Mother xsi:null="1"/> </a1:Person> <a1:Person id="ref-5”xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/Serialization%2C%20Version%3D1.0.0.0 %2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <Name id="ref-7">Diana</Name> <Father xsi:null="1"/> <Mother xsi:null="1"/> </a1:Person> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
  • 44. Personalización de la serialización en tiempo de ejecución Personalizando el proceso de serialización Personalizando el proceso de deserialización Implementación de la clase Custom Formatter Gestión de archivos y Serialización
  • 45. Personalizando el proceso de serialización Gestión de archivos y Serialización Interfaz ISerializable Implementa el método GetObjectData Alimenta el parámetro SerializationInfo al ser llamado con el método Serialize Eventos de serialización Utiliza el atributo OnSerializingAttribute para marcar un método que se ejecuta antes de que comience la serialización Utiliza el atributo OnSerializedAttribute para marcar un método que se ejecuta cuando la serialización se ha completado Serialize CustomClass GetObjectData OnSerializing Serializing SerializationInfo OnSerialized Serialized Formatter
  • 46. Personalizando el proceso de deserialización Gestión de archivos y Serialización Requerimientos de una clase personalizada Requiere un constructor de deserialización Alimentar el objeto con los datos del parámetro SerializationInfo Eventos de deserialización Utilizar el atributo OnDeserializingAttribute para marcar un método para que se ejecute antes de que comience la deserialización Y OnDeserializedAttribute para otro método cuando se haya completado CustomClass Deserialize SerializationInfo Deserialization Constructor Deserializing OnDeserializing Deserialized OnDeserialized Formatter
  • 47. Implementación de la clase Custom Formatter Gestión de archivos y Serialización Implementar IFormatter.Serialize Si el objeto implementa ISerializable, llamar GetObjectData Utilizar la clase de apoyo FormatterServices para recuperar los miembros a serializar Escribir los metadatos del objetos y sus datos al Stream de serialización Utilizar la clase de apoyo SerializationObjectManager para lanzar los eventos de serialización Implementar IFormatter.Deserialize Leer el Stream de serialización y extraer los metadatos y datos Utilizar la clase de apoyo FormatterServices para crear una instancia vacía del objeto Si el objeto dispone de un constructor de deserialización, llamarlo para alimentar al objeto, en caso contrario, cumplimentar la información en el método Deserialize Utilizar un objeto ObjectManager para gestionar las referencias y lanzar los eventos
  • 48. Serialización y deserialización de objetos como datos XML Cómo serializar un objeto como XML Como la clase XmlSerializer serializa datos complejos Como especificar definición de tipos XML y espacios de nombres Como controlar la serialización XML para un tipo Personalización del proceso de serialización XML Como deserializar un objeto desde un Stream XML Gestión de archivos y Serialización
  • 49. Cómo serializar un objeto como XML Gestión de archivos y Serialización Uso de la clase XmlSerializer Crear un objeto XmlSerializer y especificar el tipo de objeto a serializar Llamar al método Serialize y enviar los datos a un objeto Stream, TextWritero XmlWriter Requerimientos de un tipo serializable Debe ser un tipo público No necesita el atributo Serializable Debe disponer de un constructor por defecto público (para deserializar) Debe tener acceso público a los campos y propiedades que contiene los datos a serializar Serializable <?xml version="1.0"> <BankCustomer xmlns:xsi="... " > <CustomerName>Fred</CustomerName> </BankCustomer> Public BankCustomer BankCustomer() CustomerName creditCardPin
  • 50. Gestión de archivos y Serialización Cómo serializar un objeto como XML using System.Xml.Serialization; publicclass OrderInfo { public string OrderId; public DateTime OrderDate; public decimal Cost; internal int ProfitPercent = 75; } ... OrderInfo order = new OrderInfo(); order.OrderId = "Order1"; order.OrderDate = DateTime.Now; order.Cost = 10.99M; XmlSerializer serializer = new XmlSerializer(typeof(OrderInfo)); FileStream xmlStream = new FileStream(@"E:emocoderder.xml", FileMode.Create, FileAccess.Write); serializer.Serialize(xmlStream, order); xmlStream.Close(); <?xml version="1.0"?> <OrderInfo xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <OrderId>Order1</OrderId> <Orderdate>2008-04-01T09:39:13.9010496-08:00</Orderdate> <Cost>10.99</Cost> </OrderInfo>
  • 51. Cómo serializa datos complejos la clase XmlSerializer Gestión de archivos y Serialización Serialización de objetos complejos El formato XML representa las relaciones entre objetos como una estructura jerárquica de datos. Múltiples referencias generan datos duplicados. Serialización de colecciones de objetos Hay que especificar el tipo de los objetos de la colección al crear el objeto XmlSerializer desde el espacio de nombres System.Xml.Serialization <?xml version="1.0"?> <ArrayOfAnyType xmlns:xsi=“..."> <anyType xsi:type="Person"> <Name>Diana</Name> <Id>2</Id> </anyType> <anyType xsi:type="Person"> <Name>John</Name> <Id>1</Id> </anyType> <anyType xsi:type="Person"> <Name>Francesca</Name> <Id>3</Id> <Father> <Name>John</Name> <Id>2</Id> </Father> <Mother> <Name>Diana</Name> <Id>1</Id> </Mother> </anyType> </ArrayOfAnyType> <?xml version="1.0"?><Person xmlns:xsi="... " > <Name>Francesca</Name> <Id>3</Id> <Father> <Name>John</Name> <Id>1</Id> </Father> <Mother> <Name>Diana</Name> <Id>2</Id> </Mother> </Person>
  • 52. Como especificar definición de tipos XML y espacios de nombres Gestión de archivos y Serialización Atributo que cambia la definición del tipo de una clase cuando se serializa como XML XmlType Propiedades comunes de XmlType TypeName Namespace Person XmlType(TypeName:="FamilyMember") XmlType(TypeName:="FamilyMember", Namespace:="http://adventure-works.com/personnel") Name Id <?xml version="1.0"?> <Person xmlns:xsi="..."> <Name>John</Name> <Id>2</Id> </FamilyMember> <?xml version="1.0"?> <FamilyMember xmlns:xsi="..."> <Name>John</Name> <Id>2</Id> </FamilyMember> <?xml version="1.0"?> <FamilyMember xmlns:xsi="..."> <Name xmlns="http://adventure-works.com/personnel">John</Name> <Id xmlns="http://adventure-works.com/personnel">2</Id> </FamilyMember>
  • 53. Como controlar la serialización XML para un tipo Gestión de archivos y Serialización Atributos XML Atributos para campos, propiedades, parámetros de métodos y valores de retorno Atributos para tipos XmlArrayAttribute XmlEnumAttribute XmlAttributeAttribute XmlArrayItemAttribute XmlIgnoreAttribute XmlElementAttribute XmlTextAttribute XmlRootAttribute XmlIncludeAttribute
  • 54. Como personalizar el proceso de serialización XML Gestión de archivos y Serialización Interfaz IXmlSerializable Implementa el método WriteXml con un único parámetro XmlWriter Escribe XML correctamente formateado mediante los métodos del XmlWriter Public BankCustomer BankCustomer() WriteXml(XmlWriter) CustomerName creditCardPin creditCardPin <?xml version="1.0"> <BankCustomer xmlns:xsi="... " > <CustomerName>Fred</CustomerName> <encryptedPin>&^@:%&JA</encryptedPin> </BankCustomer>
  • 55.
  • 56. Informar sólo los miembros públicos, utilizando los valores leídos de los datos serializados.Asegurarse de que los tipos deserializados corresponden al esquema de los datos serializados. Gestionar los eventos de deserialización para manejar los datos inesperados. Implementar el método ReadXml del interfaz IXmlSerializable para personalizar el proceso de deserialización XML.

Notas del editor

  1. The BinaryFormatter and SoapFormatter classes use a common mechanism to serialize data in two common formats. They both implement the IFormatter interface to provide Serialize and Deserialize methods that can take advantage of classes that implement the ISerializable interface. In fact, both formatter classes are based on the same serialization infrastructure that the .NET Framework class library provides. You can take advantage of this infrastructure to build your own custom formatter classes if you must serialize data in a completely different format. Understanding the IFormatter Interface and the Formatter Class A custom formatter class can implement the methods and properties in the Iformatter interface. This interface defines two methods, Serialize and Deserialize, which have already been described in this module. The IFormatter interface also contains three properties. The following table describes these properties. Property Description Binder This property gets or sets the SerializationBinder object that is used to determine the types for constructing objects when you deserialize a stream. Context This property gets or sets the SerializationContext object that the serialization and deserialization processes use. SurrogateSelector This property makes it possible for one class to take responsibility for serializing and deserializing objects of another class. Such classes are referred to as serialization surrogates. A serialization surrogate is discovered and invoked through an ISurrogateSelector object. This property gets or sets the ISurrogateSelector object that the formatter can use. Two parameters are passed to the Serialize method: a Stream object to send serialized data to and a reference to the object to be serialized down this stream. The Serialize method can perform the following tasks: Determine whether the type of the object is serializable and throw a SerializationException exception if it is not. Call the method that is tagged with the OnSerializingAttribute attribute for each serialized object (if the object has such a method). Create SerializationInfo and StreamingContext objects. Populate the StreamingContext object with information about the current streaming context. If the object that is being serialized implements the ISerializable interface, call the GetObjectData method of this object, passing the SerializationInfo and StreamingContext objects to it. If the object that is being serialized does not implement the ISerializable interface, populate the SerializationInfo object with the data from the object that is being serialized. Write the metadata that identifies the assembly and type of the object that is being serialized to the output stream. Note: When you implement the Serialize method, you can ensure that you serialize not only the data that the object holds, but also enough information to enable the Deserialize method to identify the type of the object and instantiate it. Iterate through the SerializationInfo object and write the data to the output stream. Call the method that is tagged with the OnSerializedAttribute attribute for the object that is being serialized (if the object has such a method). A single parameter is passed to the Deserialize method: a Stream object to provide access to the serialized data. The Deserialize method can perform the following tasks: Read the stream and parse the metadata to determine which assembly to use and which type to construct. Load the assembly and type into memory, and create a new, empty instance of the type that is being deserialized. Create and populate a SerializationInfo object with the data in the serialization stream. Create and populate a StreamingContext object with information about the current streaming context. Call the method that is tagged with the OnDeserializingAttribute attribute for the object that is being serialized (if the object has such a method). Use reflection to determine whether the type implements a deserialization constructor; if it does, create and populate a new instance by using this constructor, passing the SerializationInfo and StreamingContext objects to it. If the type does not provide a deserialization constructor, create and populate the object by using the data from the SerializationInfo object. Call the method that is tagged with the OnDeserializedAttribute attribute for the object that is being deserialized (if the object has such a method). If the type that is being deserialized implements the IDeserializationCallback interface, call the OnDeserialization method of the object. The simplest way to implement a formatter object is to inherit from the Formatter abstract class in the System.Runtime.Serialization namespace. This class provides a default implementation of some key aspects of the serialization process, and contains abstract methods and properties that you override to implement your own functionality. In addition, the System.Runtime.Serialization namespace contains several other helper classes that can assist you to create a custom formatter. These classes include SerializationObjectManager and ObjectManager, FormatterServices, and FormatterConverter. Understanding the SerializationObjectManager and ObjectManager Classes You use the SerializationObjectManager class when you serialize an object. You can create an instance of this class in the Serialize method of a custom formatter. As you start to serialize each object, call the RegisterObject method of the SerializationObjectManager object; this method calls any method that is tagged with the OnSerializingAttribute attribute to be executed for the object that is being serialized.When you have serialized an object, call the RaiseOnSerializedEvent method of the SerializationObjectManager to invoke any method that is tagged with the OnSerializedAttribute attribute in the object that is being serialized. When you implement the Deserialize method of a custom formatter, you can make use of an ObjectManager object. The ObjectManager class has already been described in the previous lesson; its primary function is to enable the deserialization process to track which objects have already been created when you deserialize a complex graph that potentially contains multiple references to the same objects. In the Deserialize method, you can call the RegisterObject method of the ObjectManager class as you deserialize objects. The RegisterObject method expects you to provide a numeric identifier for the object. You can create an instance of the ObjectIDGenerator class and create these identifiers by calling the GetId method. The ObjectIDGenerator class also provides a method that is called HasId, which you can use to determine whether an object that is referenced in the serialization stream has already been deserialized or whether this is a new instance. If you detect a reference to an object that has not yet been deserialized, you can record this reference by using the RecordDelayedFixup and RecordFixup methods of the ObjectManager object. At the end of the deserialization process, you can call the DoFixups method of the ObjectManager class to resolve all object references. The ObjectManager class has another purpose: it can call any method that is marked with the OnDeserializingAttribute attribute before serialization commences. It can also invoke any method that is tagged with the OnDeserializedAttribute attribute and call the OnDeserialization method for deserialized objects that implement the IDeserializationCallback interface. To invoke a method that is tagged with the OnDeserializingAttribute attribute, call the RaiseOnDeserializingEvent method. To invoke a method that is marked with the OnDeserializedAttribute attribute and call the OnDeserialization method, register the object with the ObjectManager object and then call the RaiseDeserializationEvent method. Understanding the FormatterServices Class The FormatterServices class contains static (C#) or Shared (Visual Basic) methods that you can use to obtain information about objects that are being serialized and deserialized. The following table lists the most commonly used methods. Method Description GetSerializableMembers This method returns an array of serializable members for a type. Any members that are tagged with the NonSerializedAttribute attribute are omitted. The Serialize method of a custom formatter class can use this data to ensure that only the correct members of an object are written to the serialization stream. GetTypeFromAssemblyThis method returns the information for a specified type from an assembly. GetUninitializedObject This method creates a new instance of an object by using the specified type. PopulateObjectMembersThis method fills the fields of an uninitialized object with the values that are provided. You can use the PopulateObjectMembers method in conjunction with GetUninitializedObject and GetTypeFromAssembly to construct a new object during the deserialization process. You can assume that your serialization stream contains metadata about the type of each object. Call GetTypeFromAssembly to create a Type object, call GetUninitializedObject to create an instance of this type, and then call PopulateObjectMembers to fill this object with data that is retrieved from the serialization stream. Understanding the IFormatterConverter Interface and the FormatterConverter Class When you serialize and deserialize data, you create a SerializationInfo object that contains the fields that are serialized or deserialized. Each field may require converting into a different format as it is written to or read from the serialization stream. You can create a class that implements the IFormatterConverter interface to parse the data that is held in the SerializationInfo object and perform these conversions. Alternatively, the FormatterConverter class provides a default implementation of the methods in the IFormatterConverter interface. If this default implementation meets your requirements, create an instance of this class when you serialize and deserialize data. You can also inherit from the FormatterConverter class and override any methods that you must modify. Creating a Custom Formatter Class The following code examples illustrate a custom formatter class that serializes data as ordinary text, and show how to implement the Serialize and Deserialize methods (the other methods and properties have been omitted from these examples). Note: These code examples serialize and deserialize only types that contain members that are primitive types or strings. Additionally, the Deserialize method makes use of reflection. The details of reflection are outside the scope of this course, so this method is provided for information only. [Visual C#] class TextFormatter : Formatter { ... public override void Serialize(System.IO.Stream serializationStream, object graph) { Type objectType = graph.GetType(); // Verify that the object is serializable if (objectType.IsSerializable) { // Create the objects and context for serializing the data StreamWriter writer = new StreamWriter(serializationStream); FormatterConverter converter = new FormatterConverter(); SerializationInfo info = new SerializationInfo(objectType, converter); StreamingContext context = new StreamingContext(); // Register the object being serialized and raise the OnSerializing event SerializationObjectManager objectManager = new SerializationObjectManager(context); objectManager.RegisterObject(graph); if (graph is ISerializable) { // If the object implements ISerializable then let it populate the // SerializationInfo object ((ISerializable)graph).GetObjectData(info, context); } else { // Otherwise populate the SerializationInfo object with the data for // each serializable field foreach (FieldInfo field in FormatterServices.GetSerializableMembers(objectType)) { info.AddValue(field.Name, field.GetValue(graph)); } } // Output the metadata describing the object type string metadata = String.Format(&quot;Type:{0}&quot;, objectType.FullName); writer.WriteLine(metadata); metadata = String.Format(&quot;Assembly:{0}&quot;, objectType.Assembly); writer.WriteLine(metadata); // Output the data in each field SerializationInfoEnumerator infoEnumerator = info.GetEnumerator(); while (infoEnumerator.MoveNext()) { SerializationEntry entry = infoEnumerator.Current; string data = String.Format(&quot;{0}:{1}:{2}&quot;, entry.Name, entry.Value, entry.ObjectType.FullName); writer.WriteLine(data); } // Raise the OnSerialized event for the object objectManager.RaiseOnSerializedEvent(); // Flush the stream and ensure that all data is output writer.Flush(); } else { // Throw an exception if the object is not serializable string message = String.Format(&quot;{0} is not marked as serializable.&quot;, objectType.ToString()); throw new SerializationException(message); } } public override object Deserialize(System.IO.Stream serializationStream) { try { StreamReader reader = new StreamReader(serializationStream); // Read and parse the first two lines of the stream // The first line contains the type, in the format Type:Namespace.Type string line = reader.ReadLine(); string[] data = line.Split(&apos;:&apos;); string typeName = data[1]; // The second line contains the metadata for the assembly, // in the format Assembly:&lt;metadata&gt; line = reader.ReadLine(); data = line.Split(&apos;:&apos;); string assemblyName = data[1]; // Load the assembly into memory Assembly assembly = Assembly.Load(assemblyName); // Create an empty instance of the type being deserialized Type type = FormatterServices.GetTypeFromAssembly(assembly, typeName); object deserializedObject = FormatterServices.GetUninitializedObject(type); // Create and populate a serializationInfo object with the fields in the stream FormatterConverter converter = new FormatterConverter(); SerializationInfo info = new SerializationInfo(type, converter); // This implementation only recognizes members with types // implemented in the core .NET Framework assembly Assembly systemAssembly = Assembly.ReflectionOnlyLoad( &quot;mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;); ArrayList objectData = new ArrayList(); while ((line = reader.ReadLine()) != null) { // Each line has the format FieldName:Value:TypeCode data = line.Split(&apos;:&apos;); // Get the type of the serialized member Type dataType = systemAssembly.GetType(data[2]); // Add the member to the SerializationInfo collection, // converting it to the correct type info.AddValue(data[0], converter.Convert(data[1], dataType)); // Also save the data in an object array in case you need to // populate the object manually objectData.Add(converter.Convert(data[1], dataType)); } // Create a StreamingContext stating that the data is coming from a file StreamingContext context = new StreamingContext(StreamingContextStates.File); // Create an ObjectManager object and raise the OnDeserializing event // for the object being deserialized ObjectManager manager = new ObjectManager(null, context); manager.RaiseOnDeserializingEvent(deserializedObject); // Determine if the object being deserialized has a deserialization constructor Type serializationInfoType = info.GetType(); Type streamingContextType = context.GetType(); Type[] deserializationConstructorParams = new Type[] {serializationInfoType, streamingContextType}; ConstructorInfo constructor = type.GetConstructor( BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, deserializationConstructorParams, null); // If the object has a deserialization constructor then call it to populate the object if (constructor != null) { Object[] args = new Object[] {info, context}; constructor.Invoke(deserializedObject, args); } // Otherwise populate it manually else { MemberInfo[] members = type.GetFields( BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); FormatterServices.PopulateObjectMembers(deserializedObject, members, objectData.ToArray()); } // Call the OnDeserialization method if the object implements IDeserializationCallback // and raise the OnDeserialized event for the object bool firstTime; manager.RegisterObject(deserializedObject, m_idGenerator.GetId(deserializedObject, out firstTime)); manager.RaiseDeserializationEvent(); // Return the deserialized object return deserializedObject; } catch (Exception e) { string message = String.Format(&quot;Unable to deserialize object: {0}&quot;, e.Message); throw new SerializationException(message); } } ... } [Visual Basic] Class TextFormatter Inherits Formatter ... Public Overrides Sub Serialize(ByVal serializationStream As System.IO.Stream, _ ByVal graph As Object) Dim objectType As Type = graph.GetType() &apos; Verify that the object is serializable If objectType.IsSerializable Then &apos; Create the objects and context for serializing the data Dim writer As New StreamWriter(serializationStream) Dim converter As New FormatterConverter() Dim info As New SerializationInfo(objectType, converter) Dim context As New StreamingContext() &apos; Register the object being serialized and raise the OnSerializing event Dim objectManager As New SerializationObjectManager(context) objectManager.RegisterObject(graph) If TryCast(graph, ISerializable) IsNot Nothing Then &apos; If the object implements ISerializable then let it populate the &apos; SerializationInfo object graph.GetObjectData(info, context) Else &apos; Otherwise populate the SerializationInfo object with the data for each &apos; serializable field For Each field As FieldInfo In _ FormatterServices.GetSerializableMembers(objectType) info.AddValue(field.Name, field.GetValue(graph)) Next field End If &apos; Output the metadata describing the object type Dim metadata As String = String.Format(&quot;Type:{0}&quot;, _ objectType.FullName) writer.WriteLine(metadata) metadata = String.Format(&quot;Assembly:{0}&quot;, objectType.Assembly) writer.WriteLine(metadata) &apos; Output the data in each field Dim infoEnumerator As SerializationInfoEnumerator = info.GetEnumerator() While infoEnumerator.MoveNext() Dim entry As SerializationEntry = infoEnumerator.Current Dim data As String = String.Format(&quot;{0}:{1}:{2}&quot;, entry.Name, _ converter.ToString(entry.Value), entry.ObjectType.FullName) writer.WriteLine(data) End While &apos; Raise the OnSerialized event for the object objectManager.RaiseOnSerializedEvent() &apos; Flush the stream and ensure that all data is output writer.Flush() Else &apos; Throw an exception if the object is not serializable Dim message As String = _ String.Format(&quot;{0} is not marked as serializable.&quot;, objectType.ToString()) Throw New SerializationException(message) End If End Sub Public Overrides Function Deserialize( _ ByVal serializationStream As System.IO.Stream) As Object Try Dim reader As New StreamReader(serializationStream) &apos; Read and parse the first two lines of the stream &apos; The first line contains the type, in the format Type:Namespace.Type Dim line As String = reader.ReadLine() Dim data() As String = line.Split(&quot;:&quot;) Dim typeName As String = data(1) &apos; The second line contains the metadata for the assembly, &apos; in the format Assembly:&lt;metadata&gt; line = reader.ReadLine() data = line.Split(&quot;:&quot;) Dim assemblyName As String = data(1) &apos; Load the assembly into memory Dim assembly As Assembly = assembly.Load(assemblyName) &apos; Create an empty instance of the type being deserialized Dim type As Type = FormatterServices.GetTypeFromAssembly(assembly, typeName) Dim deserializedObject As Object = _ FormatterServices.GetUninitializedObject(type) &apos; Create and populate a serializationInfo object with the fields in the stream Dim converter As New FormatterConverter() Dim info As New SerializationInfo(type, converter) &apos; This implementation only recognizes members with types implemented &apos; in the core .NET Framework assembly Dim systemAssembly As Assembly = assembly.ReflectionOnlyLoad( _ &quot;mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;) Dim objectData As New ArrayList() line = reader.ReadLine() While line IsNot Nothing &apos; Each line has the format FieldName:Value:TypeCode data = line.Split(&quot;:&quot;) &apos; Get the type of the serialized member Dim dataType As Type = systemAssembly.GetType(data(2)) &apos; Add the member to the SerializationInfo collection, &apos; converting it to the correct type info.AddValue(data(0), converter.Convert(data(1), dataType)) &apos; Also save the data in an object array in case we need to &apos; populate the object manually objectData.Add(converter.Convert(data(1), dataType)) line = reader.ReadLine() End While &apos; Create a StreamingContext stating that the data is coming from a file Dim context = New StreamingContext(StreamingContextStates.File) &apos; Create an ObjectManager object and raise the OnDeserializing event &apos; for the object being deserialized Dim manager = New ObjectManager(Nothing, context) manager.RaiseOnDeserializingEvent(deserializedObject) &apos; Determine if the object being deserialized has a &apos; deserialization constructor Dim serializationInfoType As Type = info.GetType() Dim streamingContextType As Type = context.GetType() Dim deserializationConstructorParams() As Type = _ {serializationInfoType, streamingContextType} Dim constructor As ConstructorInfo = type.GetConstructor( _ BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance, _ Nothing, deserializationConstructorParams, Nothing) &apos; If the object has a deserialization constructor then call it &apos; to populate the object If constructor IsNot Nothing Then Dim args() As Object = {info, context} constructor.Invoke(deserializedObject, args) &apos; Otherwise populate it manually Else Dim members() As MemberInfo = type.GetFields( _ BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance) FormatterServices.PopulateObjectMembers(deserializedObject, members, _ objectData.ToArray()) End If &apos; Call the OnDeserialization method if the object implements &apos; IDeserializationCallback &apos; and raise the OnDeserialized event for the object Dim firstTime As Boolean manager.RegisterObject(deserializedObject, _ m_idGenerator.GetId(deserializedObject, firstTime)) manager.RaiseDeserializationEvent() &apos; Return the deserialized object Return deserializedObject Catch e As Exception Dim message As String = String.Format( _ &quot;Unable to deserialize object: {0}&quot;, e.Message) Throw New SerializationException(message) End Try End Function ... End Class The following code examples show how to create and use the TextFormatter class to serialize an object as text and store it in a file that is called data.txt. [Visual C#] namespace ProductAssembly { [Serializable] class Product { public int ProductId; public string ProductName; public decimal ProductPrice; } } … ProductAssembly.Product product = new ProductAssembly.Product(); product.ProductId = 1; product.ProductName = &quot;Hammer&quot;; product.ProductPrice = 11.99M; FileStream serializationStream = new FileStream(@&quot;E:\\Democode\\data.txt&quot;, FileMode.Create, FileAccess.Write); TextFormatter textWriter = new TextFormatter(); textWriter.Serialize(serializationStream, product); serializationStream.Close(); [Visual Basic] Namespace ProductAssembly &lt;Serializable()&gt; Class Product Public ProductId As Integer Public ProductName As String Public ProductPrice As Decimal End Class End Namespace ... Dim product As New ProductAssembly.Product() product.ProductId = 1 product.ProductName = &quot;Hammer&quot; product.ProductPrice = 11.99 Dim serializationStream As New FileStream(&quot;E:\\Democode\\data.txt&quot;, FileMode.Create, FileAccess.Write) Dim textWriter As New TextFormatter() textWriter.Serialize(serializationStream, product) serializationStream.Close() The following code example illustrates the data.txt file that the TextFormatter object produces. Type:CustomFormatter.ProductAssembly.Product Assembly:CustomFormatter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ProductId:1:System.Int32 ProductName:Hammer:System.String ProductPrice:11.99:System.Decimal