Установка начального значения свойства при использовании DataContractSerializer - PullRequest
9 голосов
/ 28 апреля 2010

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

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

Это легко сделать с помощью конструктора, но, насколько я понимаю, 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;
    }
}

Ответы [ 2 ]

15 голосов
/ 20 мая 2010

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

10 голосов
/ 28 апреля 2010

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

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

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

...