7

Si je sérialisation et désérialisation ultérieure d'une classe à l'aide de DataContractSerializer, comment puis-je contrôler les valeurs initiales des propriétés qui n'ont pas été sérialisées?Définition de la valeur initiale d'une propriété lors de l'utilisation de DataContractSerializer

Envisagez la classe Person ci-dessous. Son contrat de données est configuré pour sérialiser les propriétés FirstName et LastName, mais pas la propriété IsNew. Je veux IsNew pour initialiser à TRUE si une nouvelle personne est instanciée comme une nouvelle instance ou être désérialisée à partir d'un fichier.

Ceci est facile à faire à travers le constructeur, mais si je comprends bien, DataContractSerializer n'appelle pas le constructeur car ils pourraient nécessiter des paramètres.

[DataContract(Name="Person")] 
public class Person 
{ 
    [DataMember(Name="FirstName")] 
    public string FirstName { get; set; } 

    [DataMember(Name = "LastName")] 
    public string LastName { get; set; } 

    public bool IsNew { get; set; } 

    public Person(string first, string last) 
    { 
     this.FirstName = first; 
     this.LastName = last; 
     this.IsNew = true; 
    } 
} 

Répondre

10

Vous pouvez utiliser un rappel de sérialisation. Ajoutez la méthode suivante à votre classe Person:

[OnDeserialized] 
void OnDeserialized(StreamingContext context) 
{ 
    this.IsNew = true; 
} 

Une autre option consiste à supprimer les [DataContract] et [DataMember] attributs. Dans ce cas DCSerializer appellera votre constructeur quand il désérialise.

+1

Comme Pavel mentionne qu'il devrait être [OnDeserializing] sinon la valeur sera écrasée chaque fois plutôt qu'une seule fois (quand il était absent). –

14

En fait, la bonne façon de le faire est en utilisant l'attribut OnDeserializing (notez le suffixe « ing »). La méthode marquée avec cet attribut est appelée avant que les valeurs membres ne soient désérialisées.

+0

Merci. Oui, OnDeserializing est la bonne façon. Il permet de définir la valeur par défaut qui peut être remplacée si la source a la valeur pour la propriété. – Hong