Deserializzazione con DataContractJsonSerializer e costruttori

Scritto da  Massimo Bonanni il domenica 8 gennaio 2012  •  Linguaggio: VB   • 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

 
x