Todo sobre la serialización en Visual Basic

La serialización es el proceso de convertir un objeto en una secuencia lineal de bytes llamado "flujo de bytes". La deserialización simplemente invierte el proceso. Pero, ¿por qué querrías convertir un objeto en una secuencia de bytes?

La razón principal es para que pueda mover el objeto. Considera las posibilidades. Como "todo es un objeto" en .NET, puede serializar cualquier cosa y guardarla en un archivo. Para que pueda serializar imágenes, archivos de datos, el estado actual de un módulo de programa ('estado' es como un instantánea de su programa en un momento determinado para que pueda suspender temporalmente la ejecución y comenzar de nuevo luego)... lo que sea que necesites hacer.

También puede almacenar estos objetos en el disco en archivos, enviarlos a través de la web, pasarlos a un programa diferente, guardar una copia de seguridad por seguridad. Las posibilidades son literalmente infinitas.

Es por eso que la serialización es un proceso clave en .NET y Visual Basic. A continuación se muestra una sección sobre serialización personalizada mediante la implementación de

instagram viewer
ISerializable interfaz y codificación a Nuevo y un GetObjectDatasubrutina

Como primer ejemplo de serialización, hagamos uno de los programas más fáciles, pero también uno de los más útiles: serializar datos y luego deserializar datos en una clase simple hacia y desde un archivo. En este ejemplo, los datos no solo se serializan, sino que también se guarda la estructura de los datos. La estructura aquí se declara en un módulo para guardar cosas... bien... estructurado.

Módulo SerializeParms
Parm de clase pública Ejemplo
Nombre público de Parm1 como cadena = "Nombre de Parm1"
Public Parm1Value As Integer = 12345
Parm2Name público como cadena
Parm2 público Valor como decimal
Clase final
Módulo final

Luego, los valores individuales se pueden guardar en un archivo como este:

Sistema de Importaciones. Tiempo de ejecución. Publicación por entregas. Formateadores Binario
Sistema de Importaciones. IO
Formulario de clase pública1
Private Sub mySerialize_Click (_
Remitente ByVal como sistema. Objeto, _
ByVal e como sistema. EventArgs) _
Maneja mySerialize. Hacer clic
Dim ParmData como nuevo ParmExample
ParmData. Parm2Name = "Nombre de Parm2"
ParmData. Parm2Value = 54321.12345
Dim s As New FileStream ("ParmInfo", FileMode. Crear)
Dim f As New BinaryFormatter
F. Serializar (s, ParmData)
s. Cerca()
End Sub
Clase final

Y esos mismos valores se pueden recuperar así:

Sistema de Importaciones. Tiempo de ejecución. Publicación por entregas. Formateadores Binario
Sistema de Importaciones. IO
Formulario de clase pública1
Private Sub myDeserialize_Click (_
Remitente ByVal como sistema. Objeto, _
ByVal e como sistema. EventArgs) _
Maneja myDeserialize. Hacer clic
Dim s = New FileStream ("ParmInfo", FileMode. Abierto)
Dim f As New BinaryFormatter
Dim RestoredParms As New Parm Ejemplo
RestoredParms = f. Deserializar (s)
s. Cerca()
Consola. WriteLine (RestoredParms. Parm1Name)
Consola. WriteLine (RestoredParms. Parm1Value)
Consola. WriteLine (RestoredParms. Parm2Name)
Consola. WriteLine (RestoredParms. Parm2Value)
End Sub
Clase final

UN Estructura o una colección (como un Lista de arreglo) preferible a Clase También podría ser serializado a un archivo de la misma manera.

Ahora que hemos repasado el proceso básico de serialización, veamos los detalles específicos que forman parte del proceso en la página siguiente.

Una de las primeras cosas que debe notar sobre este ejemplo es el atributo en el Clase. Atributos son solo más información que puede proporcionar a VB.NET sobre un objeto y se utilizan para muchas cosas diferentes. El atributo en este código le dice a VB.NET que agregue código adicional para que más adelante, todo en esta clase pueda ser serializado.

Si hay elementos específicos en la Clase que usted no lo hagas desea ser serializado, puede usar el atributo para excluirlos:

Public Parm3Value As String = "Lo que sea"

En el ejemplo, el aviso es que Publicar por fascículos y Deserializar son métodos de la BinaryFormatter objeto (F en este ejemplo).

F. Serializar (s, ParmData)

Este objeto toma el FileStream objeto y el objeto a ser serializado como parámetros. Veremos que VB.NET ofrece otro objeto que permite que el resultado se exprese como XML.

Y una nota final, si su objeto incluye otros objetos subordinados, ¡también se serializarán! Pero desde todos objetos que se serializan debe estar marcado con el atributo, todos estos objetos secundarios también deben marcarse de esa manera.

Para ser completamente claro sobre lo que está sucediendo en su programa, es posible que desee mostrar el archivo llamado ParmData en el Bloc de notas para ver cómo se ven los datos serializados. (Si siguió este código, debería estar en el compartimiento. Depurar carpeta en su proyecto.) Dado que este es un archivo binario, la mayor parte del contenido no es texto legible, pero debería poder ver las cadenas en su archivo serializado. A continuación, haremos una versión XML y es posible que desee comparar los dos solo para darse cuenta de la diferencia.

Serializar a XML en lugar de un archivo binario requiere muy pocos cambios. XML no es tan rápido y no puede capturar parte de la información del objeto, pero es mucho más flexible. XML puede ser utilizado por casi cualquier otra tecnología de software en el mundo de hoy. Si desea asegurarse de que las estructuras de sus archivos no lo "vinculan" a Microsoft, esta es una buena opción a tener en cuenta. Microsoft está haciendo hincapié en "LINQ to XML" para crear archivos de datos XML en su última tecnología, pero muchas personas aún prefieren este método.

La 'X' en XML significa eXTensible En nuestro ejemplo XML, vamos a utilizar una de esas extensiones de XML, una tecnología llamada JABÓN. Esto solía significar "Protocolo simple de acceso a objetos", pero ahora es solo un nombre. (SOAP se ha actualizado tanto que el nombre original ya no encaja bien).

Lo principal que tenemos que cambiar en nuestras subrutinas es la declinación del formateador de serialización. Esto debe cambiarse tanto en la subrutina que serializa el objeto como en la que lo deserializa nuevamente. Para la configuración predeterminada, esto implica tres cambios en su programa. Primero, debe agregar una referencia al proyecto. Haga clic derecho en el proyecto y seleccione Añadir referencia .... Asegurarse ...

Sistema. Tiempo de ejecución. Publicación por entregas. Formateadores Jabón

... ha sido agregado al proyecto.

Luego cambie las dos declaraciones en el programa que lo hace referencia.

Sistema de Importaciones. Tiempo de ejecución. Publicación por entregas. Formateadores Jabón
Dim f As New SoapFormatter

Esta vez, si revisas lo mismo ParmData en el Bloc de notas, verá que todo está en texto XML legible como ...

Nombre Parm1
12345
Nombre de m2
54321.12345

También hay una gran cantidad de XML adicional que es necesario para el estándar SOAP en el archivo también. Si quieres verificar cuál es el el atributo sí, puede agregar una variable con ese atributo y mirar el archivo para verificar que no esté incluido.

El ejemplo que acabamos de codificar solo serializó los datos, pero supongamos que necesita controlar cómo se serializan los datos. VB.NET puede hacer eso también!

Para lograr esto, necesita profundizar un poco más en el concepto de serialización. VB.NET tiene un nuevo objeto para ayudar aquí: SerializationInfo. Aunque tiene la capacidad de codificar un comportamiento de serialización personalizado, conlleva un costo de codificación adicional.

Lo básico extra El código se muestra a continuación. Recuerde, esta clase se usa en lugar de la ParmExample clase que se muestra en el ejemplo anterior. Este no es un ejemplo completo. El propósito es mostrarle el nuevo código que se necesita para la serialización personalizada.

Sistema de Importaciones. Tiempo de ejecución. Publicación por entregas
_
Serialización personalizada de clase pública
Implementa ISerializable
'datos a serializar aquí
'Público serializado Variable como tipo
Public Sub New ()
'constructor predeterminado cuando la clase
'se crea - el código personalizado puede ser
'añadido aquí también
End Sub
Public Sub New (_
Información de ByVal como SerializationInfo, _
Contexto ByVal como StreamingContext)
'inicialice las variables de su programa desde
'un almacén de datos serializado
End Sub
Public Sub GetObjectData (_
Información de ByVal como SerializationInfo, _
Contexto ByVal como StreamingContext) _
Implementa ISerializable. GetObjectData
'actualizar el almacén de datos serializado
'de las variables del programa
End Sub
Clase final

La idea es que ahora puedes (y, de hecho, puedes debe) realiza todas las actualizaciones y lecturas de datos en el almacén de datos serializado en el Nuevo y GetObjectData subrutinas También debe incluir un genérico Nuevo constructor (sin lista de parámetros) porque está implementando una interfaz.

La clase normalmente tendrá propiedades formales y métodos codificados también ...

'Propiedad genérica
Private newPropertyValue As String
Propiedad pública NewProperty () como cadena
Obtener
Volver newPropertyValue
End Get
Establecer (valor ByVal como cadena)
newPropertyValue = value
Conjunto final
Terminar propiedad
'Método genérico
Public Sub MyMethod ()
'código de método
End Sub

La clase serializada resultante puede crear valores únicos en el archivo en función del código que proporcione. Por ejemplo, una clase de bienes raíces podría actualizar el valor y la dirección de una casa, pero la clase también serializaría una clasificación de mercado calculada.

los Nuevo La subrutina se verá así:

Public Sub New (_
Información de ByVal como SerializationInfo, _
Contexto ByVal como StreamingContext)
'inicialice las variables de su programa desde
'un almacén de datos serializado
Parm1Name = info. GetString ("a")
Parm1Value = info. GetInt32 ("b")
'Nuevo submarino continúa ...

Cuando Deserializar se llama en un BinaryFormatter objeto, este sub se ejecuta y un SerializationInfo el objeto se pasa al Nuevo subrutina New puede hacer lo que sea necesario con los valores de datos serializados. Por ejemplo ...

MsgBox ("Esto es Parm1Value Times Pi:" _
& (Parm1Value * Math. PI). ToString)

Lo contrario ocurre cuando Publicar por fascículos se llama, pero el BinaryFormatter llamadas a objetos GetObjectData en lugar.

Public Sub GetObjectData (_
Información de ByVal como SerializationInfo, _
Contexto ByVal como StreamingContext) _
Implementa ISerializable. GetObjectData
'actualizar el almacén de datos serializado
'de las variables del programa
If Parm2Name = "Test" Entonces
info. AddValue ("a", "Esto es una prueba")
Más
info. AddValue ("a", "Sin prueba esta vez")
Terminara si
info. AddValue ("b", 2)

Observe que los datos se agregan al archivo serializado como pares de nombre / valor.

Muchas de las páginas web que he encontrado al escribir este artículo no parecen tener un código de trabajo real. Uno se pregunta si el autor realmente ejecutó algún código antes de escribir el artículo a veces.

instagram story viewer