Rappels de sérialisation avec tolérance de version

Le modèle de programmation de contrat de données prend entièrement en charge les méthodes de rappel de sérialisation avec tolérance de version que les classes BinaryFormatter et SoapFormatter prennent en charge.

Attributs avec tolérance de version

Il existe quatre attributs de rappel. Chaque attribut peut être appliqué à une méthode que le moteur de sérialisation/désérialisation appelle à différents moments. Le tableau suivant explique quand utiliser chaque attribut.

Attribut Lorsque la méthode correspondante est appelée
OnSerializingAttribute Appelé avant de sérialiser le type.
OnSerializedAttribute Appelé après avoir sérialisé le type.
OnDeserializingAttribute Appelé avant de désérialiser le type.
OnDeserializedAttribute Appelé après avoir désérialisé le type.

Les méthodes doivent accepter un paramètre StreamingContext.

Ces méthodes sont principalement destinées à une utilisation avec le versioning ou l'initialisation. Pendant la désérialisation, aucun constructeur n'est appelé. Par conséquent, des membres de données risquent de ne pas être initialisés correctement (avec les valeurs par défaut prévues) si les données de ces membres ne figurent pas dans le flux entrant, par exemple, si les données viennent d'une version antérieure d'un type auquel il manque certains membres de données. Pour corriger ce problème, utilisez la méthode de rappel marquée avec OnDeserializingAttribute, comme indiqué dans l'exemple suivant.

Vous pouvez marquer uniquement une méthode par type avec chacun des attributs de rappel précédents.

Exemple

// The following Data Contract is version 2 of an earlier data
// contract.
[DataContract]
public class Address
{
    [DataMember]
    public string Street;

    [DataMember]
    public string State;

    // This data member was added in version 2, and thus may be missing
    // in the incoming data if the data conforms to version 1 of the
    // Data Contract. Use the callback to add a default for this case.
    [DataMember(Order=2)]
    public string CountryRegion;

    // This method is used as a kind of constructor to initialize
    // a default value for the CountryRegion data member before
    // deserialization.
    [OnDeserializing]
    private void setDefaultCountryRegion(StreamingContext c)
    {
        CountryRegion = "Japan";
    }
}
' The following Data Contract is version 2 of an earlier data 
' contract.
<DataContract()> _
Public Class Address
    <DataMember()> _
    Public Street As String
    <DataMember()> _
    Public State As String

    ' This data member was added in version 2, and thus may be missing 
    ' in the incoming data if the data conforms to version 1 of the 
    ' Data Contract.
    <DataMember(Order:=2)> _
    Public CountryRegion As String

    ' This method is used as a kind of constructor to initialize
    ' a default value for the CountryRegion data member before 
    ' deserialization.
    <OnDeserializing()> _
    Private Sub setDefaultCountryRegion(ByVal c As StreamingContext)
        CountryRegion = "Japan"
    End Sub
End Class

Voir aussi