Sunteți pe pagina 1din 12

Serializacin (C# y Visual Basic)

Visual Studio 2012


Otras versiones

Personas que lo han encontrado til: 2 de 5 - Valorar este tema La serializacin es el proceso de convertir un objeto en una secuencia de bytes para almacenar el objeto o transmitirlo a memoria, una base de datos, o en un archivo. Su propsito principal es guardar el estado de un objeto para poder crearlo de nuevo cuando se necesita. El proceso inverso se denomina deserializacin. Para obtener ejemplos de serializacin, vea Temas relacionados y ejemplos ms adelante en este tema.

Cmo funciona la serializacin


Este ejemplo muestra el proceso total de serializacin.

El objeto se serializa en una secuencia que, adems de los datos, contiene informacin sobre el tipo de objeto, como la versin, referencia cultural y nombre de ensamblado. Esa secuencia se puede almacenar en una base de datos, un archivo o en memoria.

Usos de la serializacin
La serializacin permite al desarrollador guardar el estado de un objeto y volver a crearlo cuando es necesario, y proporcionar almacenamiento de objetos e intercambio de datos. A travs de la serializacin, un desarrollador puede realizar acciones como enviar un objeto a una aplicacin remota por medio de un servicio Web, pasar un objeto de un dominio a otro, pasar un objeto a travs de un firewall como una cadena XML o mantener la seguridad o informacin especfica del usuario entre aplicaciones.

Crear un objeto serializable


Para serializar un objeto, necesita el objeto que se va a serializar, la secuencia que va a contener el objeto serializado y un objeto Formatter.System.Runtime.Serialization contiene las clases necesarias para serializar y deserializar objetos. Aplique el atributo SerializableAttribute a un tipo para indicar que se pueden serializar las instancias de ese tipo. Se produce una excepcin SerializationException si se intenta serializar pero el tipo no tiene el atributoSerializableAttribute. Si no desea que un campo de su clase se pueda serializar, aplique el atributo NonSerializedAttribute. Si un campo de un tipo serializable contiene un puntero, controlador u otra estructura de datos especfica de un entorno determinado, y el significado del campo no se puede reconstruir en un entorno diferente, es conveniente que no sea serializable. Si una clase serializada contiene referencias a objetos de otras clases marcadas con el atributo SerializableAttribute, esos objetos tambin se serializarn.

Serializacin binaria y XML


Se puede utilizar serializacin binaria o XML. En la serializacin binaria, se serializan todos los miembros, incluso aquellos que son de slo lectura, y se mejora el rendimiento. La serializacin XML proporciona cdigo ms legible, as como mayor flexibilidad para compartir objetos y utilizarlos para fines de interoperabilidad.

Serializacin binaria
La serializacin binaria utiliza la codificacin binaria a fin de generar una serializacin compacta para usos como almacenamiento o secuencias de red basadas en sockets.

Serializacin XML
La serializacin XML serializa las propiedades y campos pblicos de un objeto o los parmetros y valores devueltos de los mtodos en una secuencia XML que se ajusta a un documento especfico del lenguaje de definicin de esquemas XML (XSD). La serializacin XML produce clases fuertemente tipadas con propiedades y campos que se convierten en XML. System.Xml.Serialization contiene las clases necesarias para serializar y deserializar XML. Se pueden aplicar atributos a clases y miembros de clase para controlar la manera en que XmlSerializer serializa o deserializa una instancia de la clase.

Serializacin SOAP
La serializacin XML tambin se puede usar para serializar objetos en secuencias XML que se ajustan a la especificacin SOAP. SOAP es un protocolo basado en XML, diseado especficamente para transportar llamadas a procedimiento utilizando XML. Al igual que la serializacin XML normal, estos atributos tambin pueden utilizarse para controlar los mensajes SOAP de estilo literal que genera un servicio Web XML.

Serializacin bsica y personalizada


La serializacin se puede realizar de dos maneras: bsica y personalizada. La serializacin bsica utiliza .NET Framework para serializar automticamente el objeto.

Serializacin bsica
El nico requisito de la serializacin bsica es que se haya aplicado el atributo SerializableAttribute al objeto.NonSerializedAttribute se puede utilizar para evitar que se serialicen campos concretos. Cuando se utiliza la serializacin bsica, la versin de objetos puede crear problemas, en cuyo caso la serializacin personalizada puede ser preferible. La serializacin bsica es la manera ms fcil de realizar la serializacin, pero no proporciona mucho control sobre el proceso.

Serializacin personalizada
En serializacin personalizada, se puede especificar exactamente qu objetos se serializarn y cmo se har. La clase se debe marcar con el atributo SerializableAttribute y se debe implementar la interfaz ISerializable. Si desea deserializar el objeto tambin de una manera personalizada, debe utilizar un constructor personalizado.

Serializacin de diseador
La serializacin de diseador es una forma especial de serializacin en la que interviene el tipo de persistencia de objeto normalmente asociado a las herramientas de desarrollo. La serializacin de diseador es el proceso de convertir un grfico de objetos en un archivo de cdigo fuente que se puede utilizar despus para recuperar el grfico de objetos. Un archivo de origen puede contener cdigo, marcado o incluso informacin de tablas SQL. Para obtener ms informacin, vea Informacin general sobre serializacin de diseadores.

Tutorial: Conservar un objeto (C# y Visual Basic)


Visual Studio 2012
Otras versiones

Este tema an no ha recibido ninguna valoracin - Valorar este tema Aunque en tiempo de diseo se pueden establecer las propiedades de un objeto en valores predeterminados, cualquier valor introducido en tiempo de ejecucin se pierde cuando se destruye el objeto. Puede usar la serializacin para conservar los datos de un objeto entre las instancias, lo que permite almacenar valores y recuperarlos la prxima vez que se cree una instancia del objeto.

Nota En Visual Basic, para almacenar datos simples, como un nombre o un nmero, puede usar el objeto My.Settings.Para obtener ms informacin, vea My.Settings (Objeto).
En este tutorial, crear un objeto Loan simple y guardar sus datos en un archivo. Recuperar a continuacin los datos del archivo al volver a crear el objeto. Por ltimo, modificar el cdigo para almacenar el objeto con un formato SOAP.

Nota sobre la seguridad En este ejemplo se crea un nuevo archivo, si es que an no existe. Si una aplicacin debe crear un archivo, necesitar tener permisos Create en la carpeta correspondiente. Los permisos se establecen usando listas de control de acceso.Sin embargo, si el archivo ya existe, la aplicacin slo precisar el permiso de Write, un permiso menor. Por tanto, siempre que sea posible, resulta ms seguro crear el archivo durante la implementacin y conceder slo permisos Read a un nico archivo (en lugar de conceder permisos Create a una carpeta). Tambin es ms seguro escribir datos en carpetas de usuario en lugar de en la carpeta raz o en la carpeta Archivos de programa.

Nota sobre la seguridad En este ejemplo se almacenan datos en un formato de archivo binario o SOAP. Estos formatos no se deben usar con datos confidenciales, como contraseas o informacin de la tarjeta de crdito. Nota Los cuadros de dilogo y comandos de men que se ven pueden diferir de los descritos en la Ayuda, en funcin de los valores de configuracin o de edicin activos. Para cambiar su configuracin, haga clic en Importar y exportar configuraciones en el men Herramientas. Para obtener ms informacin, vea Valores de configuracin de Visual Studio.

Crear el objeto Loan


El primer paso consiste en crear una clase Loan y una aplicacin de prueba que utilice esta clase.

Para crear la clase Loan


1. 2.

Cree un nuevo proyecto Biblioteca de clases y denomnelo "LoanClass". Para obtener ms informacin, vea Crear soluciones y proyectos. En el Explorador de soluciones, haga clic con el botn secundario del mouse en el archivo Class1 y, a continuacin, haga clic en Cambiar nombre.Cambie el nombre del archivo a Loan y, a continuacin, presione ENTRAR. Al cambiar el nombre del archivo tambin se cambiar el nombre

3.

de la clase a Loan. Agregue a la clase los miembros pblicos siguientes: C# VB

public class Loan : System.ComponentModel.INotifyPropertyChanged { public double LoanAmount {get; set;} public double InterestRate {get; set;} public int Term {get; set;} private string p_Customer; public string Customer { get { return p_Customer; } set {

p_Customer = value; PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Customer")); } } public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; public Loan(double loanAmount, double interestRate, int term, string customer) { this.LoanAmount = loanAmount; this.InterestRate = interestRate; this.Term = term; p_Customer = customer; } }

Tambin tendr que crear una aplicacin simple que utilice la clase Loan.

Para crear una aplicacin de prueba


1. 2. 3. 4. 5. 6. 7. 8. 9.

Para agregar a la solucin un proyecto de aplicacin de Windows Forms, en el men Archivo , elijaAgregar y, a continuacin, haga clic en Nuevo proyecto. En el cuadro de dilogo Agregar nuevo proyecto, escriba LoanApp como el nombre del proyecto y haga clic en Aceptar para cerrar el cuadro de dilogo. En el Explorador de soluciones, seleccione el proyecto LoanApp. En el men Proyecto, haga clic en Establecer como proyecto de inicio. Haga clic en la opcin Agregar referencia del men Proyecto. En el cuadro de dilogo Agregar referencia, haga clic en la ficha Proyectos y seleccione el proyecto LoanClass. Haga clic en Aceptar para cerrar el cuadro de dilogo. En el diseador, agregue cuatro controles TextBox al formulario. En el Editor de cdigos, agregue el siguiente cdigo: C# VB

private LoanClass.Loan TestLoan = new LoanClass.Loan(10000.0, 0.075, 36, "Neil Black"); private void Form1_Load(object sender, EventArgs e) { textBox1.Text = TestLoan.LoanAmount.ToString(); textBox2.Text = TestLoan.InterestRate.ToString(); textBox3.Text = TestLoan.Term.ToString(); textBox4.Text = TestLoan.Customer; }

10. Agregue al formulario un controlador de eventos para el evento PropertyChanged mediante el siguiente cdigo: C# VB

private void CustomerPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { MessageBox.Show(e.PropertyName + " has been changed."); }

Llegado este punto, puede compilar y ejecutar la aplicacin.Observe que los valores predeterminados de la clase Loanaparecen en los cuadros de texto. Pruebe a cambiar el valor del tipo de inters de 7,5 a 7,1 y, a continuacin, cierre la aplicacin y ejectela de nuevo; el valor vuelve a ser el predeterminado de 7,5. En el mundo real, los tipos de inters cambian peridicamente, pero no forzosamente cada vez que se ejecuta la aplicacin. En lugar de hacer que el usuario actualice el tipo de inters cada vez que se ejecute la aplicacin, sera mejor guardar el tipo de inters ms reciente entre las instancias de la aplicacin. En el paso siguiente, har exactamente eso agregando la serializacin a la clase Loan.

Usar serializacin para guardar el objeto


Para guardar los valores de la clase Loan, primero debe marcarse la clase con el atributo Serializable.

Para marcar una clase como serializable

Cambie la declaracin de la clase Loan del modo siguiente: C# VB

[Serializable()] public class Loan : System.ComponentModel.INotifyPropertyChanged {

El atributo Serializable indica al compilador que todo el contenido de la clase se puede guardar en un archivo. Dado que el evento PropertyChanged lo controla un objeto Windows Form, no es posible serializarlo. El atributoNonSerialized se puede utilizar para marcar miembros de clase que no deberan guardarse.

Para evitar que un miembro se serialice

Cambie la declaracin del eventoPropertyChanged del modo siguiente: C# VB

[field: NonSerialized()] public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

El paso siguiente es agregar el cdigo de serializacin a la aplicacin LoanApp. Para serializar la clase y escribirla en un archivo, utilizar los espacios de nombres System.IO ySystem.Xml.Serialization. Para evitar que tenga que escribir nombres completos, puede agregar referencias a las bibliotecas de clases necesarias.

Para agregar referencias a espacios de nombres

Agregue las siguientes instrucciones al principio de la clase Form1: C# VB

using System.IO; using System.Runtime.Serialization.Formatters.Binary;

En este caso, est usando un formateador para guardar el objeto en un formato binario. Ms adelante en este tutorial modificar el cdigo para guardar el objeto en un formato SOAP. El paso siguiente es agregar cdigo para deserializar el objeto del archivo cuando se cree.

Para deserializar un objeto


1. Agregue una constante a la clase para el nombre de archivo de datos serializados. C# VB

const string FileName = @"..\..\SavedLoan.bin";

2.

Modifique el cdigo del procedimiento de eventoForm1_Load del modo siguiente: C# VB

private LoanClass.Loan TestLoan = new LoanClass.Loan(10000.0, 0.075, 36, "Neil Black"); private void Form1_Load(object sender, EventArgs e) { if (File.Exists(FileName)) { Stream TestFileStream = File.OpenRead(FileName); BinaryFormatter deserializer = new BinaryFormatter();

TestLoan = (LoanClass.Loan)deserializer.Deserialize(TestFileStream); TestFileStream.Close(); } TestLoan.PropertyChanged += this.CustomerPropertyChanged; textBox1.Text textBox2.Text textBox3.Text textBox4.Text } = = = = TestLoan.LoanAmount.ToString(); TestLoan.InterestRate.ToString(); TestLoan.Term.ToString(); TestLoan.Customer;

Observe que primero tiene que comprobar que el archivo existe. Si es as, cree una clase Stream para leer el archivo binario y una clase BinaryFormatterpara traducirlo. Asimismo, deber convertir el tipo de la secuencia en el tipo del objeto Loan. A continuacin, tiene que agregar cdigo para guardar los datos introducidos en los cuadros de texto de la clase Loany, a continuacin, debe serializar la clase en un archivo.

Para guardar los datos y serializar la clase

C# VB

Agregue el siguiente cdigo al procedimiento de evento Form1_FormClosing:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) { TestLoan.LoanAmount = Convert.ToDouble(textBox1.Text); TestLoan.InterestRate = Convert.ToDouble(textBox2.Text); TestLoan.Term = Convert.ToInt32(textBox3.Text); TestLoan.Customer = textBox4.Text; Stream TestFileStream = File.Create(FileName); BinaryFormatter serializer = new BinaryFormatter(); serializer.Serialize(TestFileStream, TestLoan); TestFileStream.Close(); }

Llegado este punto, puede volver a compilar y ejecutar la aplicacin. Inicialmente, los valores predeterminados aparecen en los cuadros de texto. Pruebe a cambiar los valores e introducir un nombre en el cuarto cuadro de texto.Cierre la aplicacin y, a continuacin, ejectela de nuevo.Observe que los nuevos valores aparecen ahora en los cuadros de texto.

Guardar el objeto con un formato SOAP


En este ejemplo se ha mostrado hasta ahora cmo guardar un objeto en un archivo de texto usando un formato binario, que resulta correcto para la mayora de las aplicaciones Windows; sin embargo, para las aplicaciones web o los servicios Web, es conveniente guardar el objeto en un archivo XML con un formato SOAP, lo que facilita el uso compartido del objeto.

Para guardar el objeto en un formato SOAP, primero debe hacerse referencia a la clase SoapFormatter. La claseSoapFormatter reside en su propio espacio de nombres:System.Runtime.Serialization.Formatters.Soap.

Para guardar el objeto con un formato SOAP


1. 2. 3. 4. 5. En el Explorador de soluciones, seleccione el proyecto LoanApp. Haga clic en la opcin Agregar referencia del men Proyecto. En el cuadro de dilogo Agregar referencia, haga clic en la ficha .NET y seleccione el componenteSystem.Runtime.Serialization.Formatters.Soap. Haga clic en Aceptar para cerrar el cuadro de dilogo. En el Editor de cdigo, agregue la siguiente instruccin al principio del mdulo Form1: C# VB

using System.Runtime.Serialization.Formatters.Soap;

6. 7.

Cambie el nombre de archivo de SavedLoan.bin aSavedLoan.xml. En el procedimiento de evento Form1_Load, cambie la declaracin de la variable deserializera: C# VB

SoapFormatter deserializer = new SoapFormatter();

8.

En el procedimiento de eventoForm1_FormClosing, cambie la declaracin de la variable serializer a: C# VB

SoapFormatter serializer = new SoapFormatter();

Llegado este punto, puede compilar y probar la aplicacin.La primera vez que ejecute la aplicacin, se crear el archivo SavedLoan.xml. Para ver el archivo, elija la opcin Mostrar todos los archivos en el Explorador de soluciones; se encuentra en el nodo Bin del proyecto de aplicacin para Windows.

Nota Si ya se encuentra en el modo Mostrar todos los archivos, para ver el archivo tendr que actualizar la vista; para ello,

seleccione Actualizar en el men Ver.


Observe que los tres miembros de la clase LoanClass se muestran en formato XML. Cambie el valor de InterestRate en el archivo XML, a continuacin gurdelo y ejecute la aplicacin de nuevo. El nuevo tipo de inters aparecer en el segundo cuadro de texto.

Cmo: Leer datos de objetos de un archivo XML (C# y Visual Basic)


Visual Studio 2012
Otras versiones

Este tema an no ha recibido ninguna valoracin - Valorar este tema En este ejemplo se leen datos de objetos escritos previamente en un archivo XML mediante la clase XmlSerializer.

Ejemplo
Este ejemplo de cdigo tambin est disponible como fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en XML. Para obtener ms informacin, vea Fragmentos de cdigo. C# VB

public class Book { public String title; } public void ReadXML() { System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(Book)); System.IO.StreamReader file = new System.IO.StreamReader( @"c:\temp\SerializationOverview.xml"); Book overview = new Book(); overview = (Book)reader.Deserialize(file); Console.WriteLine(overview.title); }

Compilar el cdigo

Sustituya el nombre de archivo "c:\IntroToVB.xml" por el nombre del archivo que contenga los datos serializados.Para obtener ms informacin sobre datos de serializacin, consulte Cmo: Escribir datos de objetos en un archivo XML (C# y Visual Basic). La clase debe tener un constructor pblico sin parmetros. Slo se deserializan propiedades y campos pblicos.

Programacin eficaz
Las condiciones siguientes pueden provocar una excepcin: La clase que se va a serializar no tiene un constructor pblico sin parmetros.

Los datos del archivo no representan datos de la clase que se va a deserializar. El archivo no existe (IOException).

Seguridad
Compruebe siempre las entradas y nunca deserialice datos procedentes de un origen que no sea de confianza. El objeto recreado se ejecuta en un equipo local con los permisos del cdigo que lo deserializ. Compruebe todas las entradas antes de utilizar los datos en la aplicacin.

Cmo: Escribir datos de objetos en un archivo XML (C# y Visual Basic)


Visual Studio 2012
Otras versiones

Este tema an no ha recibido ninguna valoracin - Valorar este tema En este ejemplo se escribe el objeto de una clase en un archivo XML mediante la clase XmlSerializer.

Ejemplo
En este ejemplo de cdigo se define una clase denominadaBook, se crea una instancia de la clase y se utiliza la serializacin XML para escribir la instancia en un archivo XML. Cdigo parecido a ste est disponible como fragmentos de cdigo de IntelliSense. En el Administrador de fragmentos de cdigo, se encuentra en XML. Para obtener ms informacin, vea Fragmentos de cdigo. C# VB

public class Book { public String title; } public void WriteXML() { Book overview = new Book();

overview.title = "Serialization Overview"; System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(Book)); System.IO.StreamWriter file = new System.IO.StreamWriter( @"c:\temp\SerializationOverview.xml"); writer.Serialize(file, overview); file.Close(); }

Compilar el cdigo
La clase debe tener un constructor pblico sin parmetros.

Programacin eficaz
Las condiciones siguientes pueden provocar una excepcin: La clase que se va a serializar no tiene un constructor pblico sin parmetros.

Seguridad
En este ejemplo se crea un nuevo archivo, si es que an no existe. Si una aplicacin necesita crear un archivo, precisar acceso Create para la carpeta correspondiente. Sin embargo, si el archivo ya existe, la aplicacin slo precisar acceso Write, un privilegio menor. Por tanto, siempre que sea posible, resulta ms seguro crear el archivo durante la implementacin y conceder slo acceso Read para un nico archivo, en lugar de acceso Create para una carpeta.

El archivo ya existe y es de slo lectura (IOException). La ruta de acceso es demasiado larga (PathTooLongException). El disco est lleno (IOException).

S-ar putea să vă placă și