Когда вызывается конструктор класса при десериализации с помощью XmlSerializer.Deserialize?

Мое приложение сохраняет класс с помощью XmlSerializer, а затем, когда это необходимо, создает экземпляр путем повторной десериализации. Я хотел бы использовать некоторые члены свойств моего класса (назначенные во время десериализации) в моей логике конструктора. Можно предположить, что свойства будут назначены первыми, и как только все свойства будут назначены, будет ли вызван конструктор?

Продолжая эту тему, есть ли доступная документация о последовательности событий, происходящих во время десериализации?


person Satyajit    schedule 04.03.2011    source источник


Ответы (2)


Нет, нельзя предполагать, что свойства будут установлены при запуске конструктора. Верно и обратное. Конструктор — это самая первая часть кода, которая запускается при создании экземпляра объекта. Невозможно установить свойства до тех пор, пока конструктор не начнет выполнение.

Процесс десериализации XML примерно выглядит следующим образом.

  • Вызов конструктора без параметров
  • Установите свойства в их десериализованные значения

Способ обойти это — использовать фабричный метод для выполнения десериализации, а затем запускать логику, которая зависит от установленных свойств. Например

class MyClass {
  ...
  public static MyClass Deserialize(string xmlContents) {
    var local = ... // Do the XML deserialization
    local.PostCreateLogic();
    return local;
  }
}
person JaredPar    schedule 04.03.2011
comment
Это верно для XmlSerializer, но некоторые сериализаторы вообще не вызывают конструктор при десериализации объекта. stackoverflow.com/q/9419743/141172 - person Eric J.; 02.06.2015

Конструктор — это создание вашего объекта. Ваш объект должен быть создан до присвоения значения свойств. Тогда конструктор будет вызываться первым.

Я не знаю никакой документации для этой последовательности. Но если ваш класс не такой большой, можно добавить точку останова, и вы увидите, какие события будут первыми.

person Kipotlov    schedule 04.03.2011