In VB.NET kunnen objecten op verschillende manieren worden geserialiseerd: met standaard .NET-serializers (BinaryFormatter, XmlSerializer, DataContractSerializer, JsonSerializer).
Wanneer te gebruiken:
BinaryFormatter - verouderd, het gebruik wordt om veiligheidsredenen afgeraden.XmlSerializer - handig voor dataverwisseling met externe programma's en voor het opslaan van instellingen.DataContractSerializer - geschikt voor de serialisatie van complexe objecten en interactie met WCF.JsonSerializer (System.Text.Json of Newtonsoft.Json) - voor moderne web-API's en intertaal-communicatie.Knelpunten:
Voorbeeld code met 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
Kan een object dat eigenschappen met niet-serialiseerbare types bevat, worden geserialiseerd? Wat zal er gebeuren?
Antwoord:
Als de klasse leden (eigenschappen/velden) bevat waarvan het type niet als serialiseerbaar is gemarkeerd, zal de serialisatie mislukken met een fout. Bijvoorbeeld, een object met een veld van het type FileStream kan niet worden geserialiseerd met behulp van XmlSerializer - er zal een uitzondering optreden omdat dit type geen serialisatie ondersteunt.
Verhaal
Serialisatiefout door een private constructeur: Bij het migreren van gegevens probeerde een ontwikkelaar een klasse te serialiseren met slechts één private constructeur. Het resultaat was dat de serialisatie faalde met een fout, waardoor het migratieproces werd onderbroken.
Verhaal
Cyclische verwijzingen: In een project werd XmlSerializer gebruikt voor serialisatie, maar er waren cyclische verwijzingen tussen objecten. De serialisatie leidde tot StackOverflowException en onopgeloste foutmeldingen van de services.
Verhaal
Toevallige gegevensverlies: In een complex object dat via JsonSerializer werd geserialiseerd, werd een lid per ongeluk gemarkeerd met
[JsonIgnore], wat leidde tot gegevensverlies tijdens verzending, waardoor de verdere deserialisatie belangrijke parameters van het object verloor.