In VB.NET, la serializzazione degli oggetti può essere realizzata in diversi modi: con i serializer standard .NET (BinaryFormatter, XmlSerializer, DataContractSerializer, JsonSerializer).
Quando usare:
BinaryFormatter — obsoleto, non consigliato per motivi di sicurezza.XmlSerializer — comodo per scambiare dati con programmi esterni e per memorizzare impostazioni.DataContractSerializer — adatto per la serializzazione di oggetti complessi e interazione con WCF.JsonSerializer (System.Text.Json o Newtonsoft.Json) — per API web moderne e interoperabilità tra linguaggi.Dettagli:
Esempio di codice 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
È possibile serializzare un oggetto che contiene proprietà con tipi non contrassegnati come serializzabili? Cosa succederà?
Risposta:
Se la classe contiene membri (proprietà/campi) il cui tipo non è contrassegnato come serializzabile, la serializzazione si concluderà con un errore. Ad esempio, non è possibile serializzare un oggetto con un campo di tipo FileStream tramite XmlSerializer — si verificherà un'eccezione, poiché questo tipo non supporta la serializzazione.
Storia
Errore di serializzazione a causa di un costruttore privato: Durante la migrazione dei dati, lo sviluppatore ha tentato di serializzare una classe con un unico costruttore privato. Risultato — la serializzazione è fallita con un errore, il processo di migrazione si è interrotto.
Storia
Riferimenti ciclici: Nel progetto, per la serializzazione è stato utilizzato XmlSerializer, ma c'erano riferimenti ciclici tra gli oggetti. La serializzazione ha portato a un StackOverflowException e a crash non gestiti dei servizi.
Storia
Perdita accidentale di dati: In un oggetto complesso serializzato tramite JsonSerializer, un membro è stato contrassegnato accidentalmente con
[JsonIgnore], portando alla perdita di parte dei dati durante il passaggio, e la successiva deserializzazione ha perso parametri importanti dell'oggetto.