Если я сериализирую и более поздняя десериализация использования класса DataContractSerializer
как я могу управлять начальными значениями свойств, которые не были сериализированы?
Рассмотрите Person
класс ниже. Его контракт данных установлен сериализировать FirstName
и LastName
свойства, но не IsNew
свойство. Я хочу IsNew
для инициализации к TRUE, является ли новый Человек, инстанцируют как новый экземпляр или десериализовываемый из файла.
Это легко сделать через конструктора, но насколько я понимаю 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:
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
this.IsNew = true;
}
Другой вариант - удалить атрибуты [DataContract] и [DataMember]. В этом случае DCSerializer вызовет ваш конструктор при десериализации.
На самом деле правильный способ сделать это - использовать атрибут OnDeserializing (обратите внимание на суффикс «ing»). Метод, отмеченный этим атрибутом, вызывается перед десериализацией значений членов.