7

Czy w przypadku przekształcania do postaci szeregowej i późniejszej deserializacji klasy przy użyciu DataContractSerializer można kontrolować początkowe wartości właściwości, które nie były serializowane?Ustawianie wartości początkowej właściwości podczas korzystania z DataContractSerializer

Weź pod uwagę klasę Person poniżej. Umowa dotycząca danych jest skonfigurowana do przekształcania do postaci szeregowej właściwości FirstName i LastName, ale nie do właściwości IsNew. Chcę IsNew, aby zainicjować PRAWDA, czy nowa osoba jest tworzona jako nowa instancja, czy jest deserializowana z pliku.

Jest to łatwe do wykonania przez konstruktora, ale jak rozumiem, DataContractSerializer nie wywołuje konstruktora, ponieważ mogą wymagać parametrów.

[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; 
    } 
} 

Odpowiedz

10

Można użyć wywołania zwrotnego serializacji. Dodaj następującą metodę do swojej klasy Person:

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

Inną opcją jest usunięcie atrybutów [DataContract] i [DataMember]. W takim przypadku DCSerializer wywoła twój konstruktor po deserializacji.

+1

Jak wspomina Pavel, powinno to być [OnDeserializing], w przeciwnym razie wartość zostanie nadpisana za każdym razem, a nie tylko raz (gdy jej brakowało). –

14

Właściwie należy to zrobić za pomocą atrybutu OnDeserializing (zwróć uwagę na sufiks "ing"). Metoda oznaczona tym atrybutem jest wywoływana, zanim wartości elementów zostaną deserialized.

+0

Dziękuję. Tak, OnDeserializing jest prawidłowy. Umożliwia ustawienie wartości domyślnej, którą można nadpisać, jeśli źródło ma wartość właściwości. – Hong