Dans VB.NET, la sérialisation des objets peut être réalisée de plusieurs manières : avec les sérialiseurs .NET standard (BinaryFormatter, XmlSerializer, DataContractSerializer, JsonSerializer).
Quand utiliser :
BinaryFormatter — obsolète, déconseillé par souci de sécurité.XmlSerializer — pratique pour échanger des données avec des programmes externes et pour stocker des paramètres.DataContractSerializer — adapté à la sérialisation d'objets complexes et aux interactions avec WCF.JsonSerializer (System.Text.Json ou Newtonsoft.Json) — pour les API web modernes et l'interopérabilité entre langages.Subtilités :
Exemple de code avec 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
Peut-on sérialiser un objet qui contient des propriétés de types non marqués comme sérialisables ? Que se passe-t-il ?
Réponse :
Si la classe contient des membres (propriétés/champs) dont le type n'est pas marqué comme sérialisable, la sérialisation échouera avec une erreur. Par exemple, un objet avec un champ de type FileStream ne pourra pas être sérialisé via XmlSerializer — une exception sera levée car ce type ne prend pas en charge la sérialisation.
Histoire
Erreur de sérialisation due à un constructeur privé : Lors de la migration des données, le développeur a tenté de sérialiser une classe avec un seul constructeur privé. En conséquence, la sérialisation a échoué avec une erreur, le processus de migration a été interrompu.
Histoire
Références cycliques : Dans le projet, le XmlSerializer était utilisé pour la sérialisation, mais il y avait des références cycliques entre les objets. La sérialisation entraînait une StackOverflowException et des échecs non gérés des services.
Histoire
Perte de données accidentelle : Dans un objet complexe sérialisé via JsonSerializer, un membre était marqué
[JsonIgnore]par accident, ce qui entraînait une perte de certaines données lors de l'envoi, et la désérialisation ultérieure perdait des paramètres importants de l'objet.