Установка начального значения свойства при использовании DataContractSerializer

Если я сериализую, а затем десериализую класс, используя DataContractSerializer, как я могу контролировать начальные значения свойств, которые не были сериализованы?

Рассмотрим класс Person ниже. Его контракт данных настроен на сериализацию свойств FirstName и LastName, но не свойства IsNew. Я хочу, чтобы IsNew инициализировалось значением TRUE независимо от того, создается ли новый экземпляр Person как новый экземпляр или десериализуется из файла.

Это легко сделать через конструктор, но я так понимаю DataContractSerializer не вызывает конструктор так как могут требовать параметры.

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

person Eric Anastas    schedule 28.04.2010    source источник


Ответы (2)


Вы можете использовать обратный вызов сериализации. Добавьте следующий метод в свой класс Person:

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

Другой вариант — удалить атрибуты [DataContract] и [DataMember]. В этом случае DCSerializer вызовет ваш конструктор при десериализации.

person alexdej    schedule 28.04.2010
comment
Как упоминает Павел, это должно быть [OnDeserializing], иначе значение будет перезаписываться каждый раз, а не только один раз (когда оно отсутствовало). - person David Hollinshead; 17.01.2017

На самом деле правильный способ сделать это — использовать атрибут OnDeserializing (обратите внимание на суффикс «ing»). Метод, помеченный этим атрибутом, вызывается перед десериализацией значений элементов.

person Pavel    schedule 19.05.2010
comment
Спасибо. Да, OnDeserializing - правильный путь. Это позволяет установить значение по умолчанию, которое может быть перезаписано, если источник имеет значение для свойства. - person Hong; 30.07.2014