En VB.NET, la serialización de objetos se puede implementar de varias maneras: usando los serializadores estándar de .NET (BinaryFormatter, XmlSerializer, DataContractSerializer, JsonSerializer).
Cuándo usar:
BinaryFormatter — está obsoleto, no se recomienda su uso por razones de seguridad.XmlSerializer — conveniente para intercambiar datos con programas externos y para almacenar configuraciones.DataContractSerializer — adecuado para la serialización de objetos complejos y la interacción con WCF.JsonSerializer (System.Text.Json o Newtonsoft.Json) — para API web modernas e interacción entre lenguajes.Matices:
Ejemplo de código con XmlSerializer:
<Serializable()> Public Class Person Public Property Name As String Public Property Age As Integer End Class Dim p As New Person With {.Name = "Ivan", .Age = 30} Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Person)) Using stream As New IO.FileStream("person.xml", IO.FileMode.Create) serializer.Serialize(stream, p) End Using
¿Se puede serializar un objeto que contiene propiedades con tipos no marcados como serializables? ¿Qué ocurrirá?
Respuesta:
Si la clase contiene miembros (propiedades/campos) cuyo tipo no está marcado como serializable, la serialización fallará. Por ejemplo, no se puede serializar un objeto con un campo de tipo FileStream a través de XmlSerializer — se producirá una excepción, ya que este tipo no admite la serialización.
Historia
Error de serialización debido a un constructor privado: Al migrar datos, el desarrollador intentó serializar una clase con un único constructor privado. El resultado — la serialización falló con un error, el proceso de migración se interrumpió.
Historia
Referencias cíclicas: En el proyecto, se utilizó XmlSerializer para la serialización, pero había referencias cíclicas entre objetos. La serialización causaba un StackOverflowException y fallos inesperados en los servicios.
Historia
Pérdida accidental de datos: En un objeto complejo serializado a través de JsonSerializer, un miembro marcado con
[JsonIgnore]por accidente resultaba en la pérdida de parte de los datos al enviarlos, y la posterior deserialización perdía parámetros importantes del objeto.