Tutorial: Guardar un objeto en Visual Basic .NET
Aunque en tiempo de diseño se pueden establecer las propiedades de un objeto en valores predeterminados, cualquier valor introducido en tiempo de ejecución se pierde cuando se destruye el objeto. En Visual Basic .NET se puede utilizar la serialización para guardar los datos de un objeto entre instancias, lo que permite almacenar valores y recuperarlos en la siguiente ocasión en que se crea una instancia del objeto.
En este tutorial, se creará un objeto Loan simple y se guardarán sus datos en un archivo, a continuación, se recuperarán los datos del archivo al volver a crear el objeto. Posteriormente, se modificará el código para guardar el objeto en un formato SOAP.
Nota de seguridad En este ejemplo se crea un archivo nuevo, si el archivo no existe ya. Si una aplicación necesita crear un archivo, precisará permisos de creación para la carpeta correspondiente. Los permisos se establecen usando listas de control de acceso. Sin embargo, si el archivo ya existe, la aplicación sólo precisará permiso de escritura, un privilegio menor. Por tanto, siempre que sea posible, resulta más seguro crear el archivo durante la implementación y conceder sólo privilegios de escritura en un solo archivo (en lugar de privilegios de creación para una carpeta). También es más seguro escribir datos en carpetas de usuario que en la carpeta raíz o en la carpeta Archivos de programa.
Nota de seguridad En este ejemplo se almacenan datos en un formato de archivo binario o SOAP. Los datos confidenciales (como contraseñas o información sobre tarjetas de crédito) no deberían almacenarse en un archivo.
Nota La plantilla Biblioteca de clases no está disponible en la edición Standard de Visual Basic .NET. Para obtener más información, vea Características de Visual Basic Standard.
Crear el objeto Loan
El primer paso es crear una clase Loan y una aplicación de prueba que use la clase.
Para crear la clase Loan
- Cree un nuevo proyecto Biblioteca de clases y denomínelo LoanClass.
- En el Editor de código, cambie el nombre de la clase de Class1 a Loan.
- Agregue a la clase los miembros públicos siguientes:
Public LoanAmount As Double = 10000.0 Public InterestRate As Double = 7.5 Public Term As Integer = 36 Public Customer As String
- En el menú Generar, elija Generar LoanClass.
Para que la clase esté disponible para su uso, se deberá generar el proyecto LoanClass.
También tendrá que crear una aplicación simple que use la clase Loan.
Para crear una aplicación de prueba
- Agregue un proyecto Aplicación para Windows a la solución y asígnele el nombre LoanApp.
- En el Explorador de soluciones, seleccione el proyecto LoanApp.
- En el menú Proyecto, haga clic en Establecer como proyecto de inicio.
- En el menú Proyecto, haga clic en Agregar referencia.
- En el cuadro de diálogo Agregar referencia, seleccione la ficha Proyectos y seleccione el proyecto LoanClass.
- Haga clic en Seleccionar y, a continuación, en Aceptar para cerrar el cuadro de diálogo.
- En el diseñador, agregue cuatro controles TextBox al formulario.
- En el Editor de códigos, agregue el siguiente código:
Private myLoan As New LoanClass.Loan Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load TextBox1.Text = myLoan.LoanAmount.ToString TextBox2.Text = myLoan.InterestRate.ToString TextBox3.Text = myLoan.Term.ToString TextBox4.Text = myLoan.Customer End Sub
Llegado este punto, puede generar y ejecutar la aplicación. Observe que los valores predeterminados de la clase Loan aparecen en los cuadros de texto. Pruebe a cambiar el valor del tipo de interés de 7,5 a 7,1, a continuación, cierre la aplicación y ejecútela de nuevo; comprobará que el valor vuelve a ser el predeterminado: 7,5.
En el mundo real, los tipos de interés cambian periódicamente, pero no forzosamente cada vez que se ejecuta la aplicación. En lugar de hacer que el usuario actualice el tipo de interés cada vez que se ejecute la aplicación, estaría bien guardar el tipo de interés más reciente entre las instancias de la aplicación. En el paso siguiente, hará exactamente eso agregando la serialización a la clase Loan.
Usar serialización para guardar el objeto
Para guardar los valores de la clase Loan, se debe primero marcar la clase con el atributo Serializable.
Para marcar una clase como serializable
- Cambie la declaración de la clase Loan del modo siguiente:
<Serializable()> Public Class Loan
El atributo Serializable indica al compilador que todo el contenido de la clase se puede guardar en un archivo. En este caso, desea guardar los miembros InterestRate, LoanAmount y Period, pero probablemente no desee guardar el miembro Customer. El atributo NonSerialized se puede usar para marcar miembros de clase que no deberían guardarse.
Para evitar que un miembro se serialice
- Cambie la declaración del miembro Customer del modo siguiente:
<NonSerialized()> Public Customer As String
El paso siguiente es agregar el código de serialización a la aplicación LoanApp. Para serializar la clase y escribirla en un archivo, usará los espacios de nombres System.IO y System.Runtime.Serialization. Para evitar escribir los nombres completos, puede usar la instrucción Imports.
Para agregar referencias a espacios de nombres
- Agregue las siguientes instrucciones Imports al principio del módulo Form1:
Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary
En este caso, está usando un formateador para guardar el objeto en un formato binario. Más adelante en este tutorial modificará el código para guardar el objeto en un formato SOAP.
El paso siguiente es agregar código para deserializar el objeto del archivo cuando se cree.
Para deserealizar un objeto
- Modifique el código del procedimiento de eventos Form1_Load del modo siguiente:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load If File.Exists("SavedLoan.bin") Then Dim myFileStream As Stream = File.OpenRead("SavedLoan.bin") Dim deserializer As New BinaryFormatter() myLoan = CType(deserializer.Deserialize(myFileStream), _ LoanClass.Loan) myFileStream.Close() End If TextBox1.Text = myLoan.LoanAmount.ToString TextBox2.Text = myLoan.InterestRate.ToString TextBox3.Text = myLoan.Term.ToString TextBox4.Text = myLoan.Customer End SubTenga en cuenta que primero tiene que comprobar que el archivo existe. Si es así, cree una clase Stream para leer el archivo binario y una clase BinaryFormatter para traducirlo. El método CType se usa para convertir del tipo de la secuencia al tipo del objeto Loan.
A continuación, tiene que agregar código para guardar los datos introducidos en los cuadros de texto en la clase Loan y para serializar la clase en un archivo.
Para guardar los datos y serializar la clase
- Agregue el código siguiente al procedimiento de eventos Form1_Closing:
Private Sub Form1_Closing(ByVal sender As System.Object, ByVal e As _ System.ComponentModel.CancelEventArgs) Handles MyBase.Closing myLoan.LoanAmount = CType(TextBox1.Text, Double) myLoan.InterestRate = CType(TextBox2.Text, Double) myLoan.Term = CType(TextBox3.Text, Integer) myLoan.Customer = TextBox4.Text Dim myFileStream As Stream = File.Create("SavedLoan.bin") Dim serializer As New BinaryFormatter() serializer.Serialize(MyFileStream, myLoan) myFileStream.Close() End Sub
Llegado este punto, puede generar y ejecutar de nuevo la aplicación. 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 aplicación y, a continuación, ejecútela de nuevo. Observe que los valores nuevos aparecen ahora en los cuadros de texto, excepto el nombre del cliente que se marcó como Nonserialized.
Guardar el objeto con un formato SOAP
En este ejemplo se ha mostrado hasta ahora cómo guardar un objeto en un objeto de texto usando un formato binario, que resulta correcto para la mayoría de las aplicaciones Windows; sin embargo, para las aplicaciones Web o los servicios Web XML, deseará guardar el objeto en un archivo XML mediante un formato SOAP, que facilita compartir el objeto.
Para guardar el objeto en un formato SOAP, deberá primero hacer referencia a la clase SoapFormatter, que reside en su propio espacio de nombres: System.Runtime.Serialization.Formatters.Soap.
Para guardar el objeto con un formato SOAP
- En el Explorador de soluciones, seleccione el proyecto LoanApp.
- En el menú Proyecto, elija Agregar referencia.
- En el cuadro de diálogo Agregar referencia, seleccione la ficha .NET y seleccione el componente System.Runtime.Serialization.Formatters.Soap.
- Haga clic en Seleccionar y, a continuación, en Aceptar para cerrar el cuadro de diálogo.
- En el Editor de código, agregue la siguiente instrucción Imports al principio del módulo Form1:
Imports System.Runtime.Serialization.Formatters.Soap
- En el procedimiento de eventos Form1_Load, cambie la instrucción Dim
Dim deserializer As New BinaryFormatter
por
Dim deserializer As New SoapFormatter
- Cambie ambas referencias de
"SavedLoan.bin"a"SavedLoan.xml". - En el procedimiento de eventos Form1_Closing, haga lo siguiente:
- Cambie la instrucción Dim de
Dim serializer As New BinaryFormatterpor
Dim serializer As New SoapFormatter.
- Cambie la referencia de
"SavedLoan.bin"a"SavedLoan.xml".
- Cambie la instrucción Dim de
Llegado este punto, puede generar y probar la aplicación. La primera vez que la ejecute, se creará el archivo SavedLoan.xml. Podrá ver este archivo si elige la opción Mostrar todos los archivos en el Explorador de soluciones; se encuentra en el nodo Bin del proyecto de aplicación para Windows.
Nota Si está ya en modo Mostrar todos los archivos, para ver el archivo tendrá que actualizar la vista eligiendo Actualizar en el menú Ver.
Observe que los tres miembros de la clase Loan se muestran en formato XML. Pruebe a cambiar el valor de InterestRate en el archivo XML, a continuación guárdelo y ejecute la aplicación de nuevo. El nuevo tipo de interés aparecerá en el segundo cuadro de texto.
Vea también
Cambios en PropertyBag en Visual Basic .NET | Guardar las propiedades de los componentes