Когда вызывается конструктор класса при десериализации с использованием XmlSerializer.Deserialize? - PullRequest
11 голосов
/ 04 марта 2011

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

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

Ответы [ 2 ]

17 голосов
/ 04 марта 2011

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

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

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

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

class MyClass {
  ...
  public static MyClass Deserialize(string xmlContents) {
    var local = ... // Do the XML deserialization
    local.PostCreateLogic();
    return local;
  }
}
0 голосов
/ 04 марта 2011

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

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

...