Deserializzazione con DataContractJsonSerializer e costruttori
Scritto da
Massimo Bonanni il
domenica 8 gennaio 2012
•
Linguaggio:
• Livello: 100
Quando si usa la classe
DataContractJsonSerializer per deserializzare dal
formato JSON, è necessario ricordarsi che il metodo
ReadObject() della stessa classe (utilizzato
nell'operazione di deserializzazione) ha la brutta
abitudine di non richiamare il costruttore della classe che stiamo
utilizzando per contenere i dati.
Per questo motivo, se abbiamo una classe con una proprietà che deve
essere valorizzata alla creazione dell'istanza e che non è
presente nello stream JSON, non possiamo contare sulla
valorizzazione di tale proprietà nel costruttore.
Ad esempio la classe:
<DataContract()>
Public Class Persona
<DataMember(Name:="nome")>
Public Property Nome As String
<DataMember(Name:="cognome")>
Public Property Cognome As String
Private _DataCreazione As DateTime = DateTime.Now
Public ReadOnly Property DataCreazione As DateTime
Get
Return Me._DataCreazione
End Get
End Property
End Class
se deserializzata con il DataContractJsonSerializer, non avrà la
proprietà DataCreazione impostata correttamente.
Per ovviare a questo possiamo utilizzare uno dei due attributi
OnDeserializedAttribute o
OnDeserializingAttribute.
Entrambi consentono di decorare dei metodi che vengono,
rispettivamente, richiamati subito dopo e immediatamente prima
della deserializzazione.
La classe precedente può essere modificata come segue:
<DataContract()>
Public Class Persona
<DataMember(Name:="nome")>
Public Property Nome As String
<DataMember(Name:="cognome")>
Public Property Cognome As String
Private _DataCreazione As DateTime = DateTime.Now
Public ReadOnly Property DataCreazione As DateTime
Get
Return Me._DataCreazione
End Get
End Property
<OnDeserializing()>
Public Sub OnDeserializing(context As StreamingContext)
Me._DataCreazione = DateTime.Now
End Sub
End Class
Tags: JSON