DataContractSerializer не вызывает Мой конструктор?
Я только что понял что-то сумасшедшее, что я считал совершенно невозможным : при десериализации объекта DataContractSerializer не вызывает конструктор !
возьмите этот класс, например:
[DataContract]
public class Book
{
public Book()
{ // breakpoint here
}
[DataMember(Order = 0)]
public string Title { get; set; }
[DataMember(Order = 1)]
public string Author { get; set; }
[DataMember(Order = 2)]
public string Summary { get; set; }
}
когда я десериализую объект этого класса, точка останова не попадает. Я совершенно не представляю, как это возможно, так как это единственный конструктор для этого объекта !
я предположил, что, возможно, дополнительный конструктор был сгенерирован компилятором из-за
2 ответов:
DataContractSerializer(какBinaryFormatter) не использовать любой конструктор. Он создает объект в памяти.например:
Type type = typeof(Customer); object obj = System.Runtime.Serialization. FormatterServices.GetUninitializedObject(type);предполагается, что процесс десериализации (или обратные вызовы, если это необходимо) будет полностью инициализировать его.
есть некоторые сценарии, которые были бы невозможны без этого поведения. Подумайте о следующем:
1) у вас есть объект, который имеет один конструктор, который устанавливает новый экземпляр для "инициализации" государства. Затем на этом экземпляре вызываются некоторые методы, которые приводят его в "обработанное" состояние. Вы не хотите создавать новые объекты, имеющие состояние "обработано", но вы все равно хотите де сериализовать / десериализовать экземпляр.
2) Вы создали класс с собственным конструктор и некоторые статические свойства для управления небольшим набором допустимых параметров конструктора. Теперь вы все еще можете сериализовать / десериализовать их.
XmlSerializer имеет поведение, которое вы ожидали. У меня были некоторые проблемы с XmlSerializer, потому что ему нужен конструктор по умолчанию. В связи с этим иногда имеет смысл иметь частные сеттеры собственности. Но сериализатор XmlSerializer также нуждаются в общественном геттер и сеттер свойства для того, чтобы сериализовать / десериализовать.
Я думаю о поведении DataContractSerializer / BinaryFormatter, таком как приостановка состояния экземпляра во время сериализации и возобновление во время десериализации. Другими словами, экземпляры не "строятся", а "восстанавливаются" до более раннего состояния.
Как вы уже упоминали, атрибут [OnDeserializing]позволяет синхронизировать несериализованные данные.
Comments