Хорошо, мы все знаем, что использовать XmlSerializer для классов без использования без параметров, поскольку десериализатор создаст объект и задает все свойства. Однако, используя Activator.CreateInstance(), можно инициализировать классы без конструктора без параметров. Например, мы могли бы создать следующий класс:
public class Foo
{
public Foo(string bar){}
}
Этот класс легко может быть инициирован активатором:
Activator.CreateInstance(typeof(Foo),"some string");
К сожалению, "Foo" не может быть сериализован с помощью XmlSerializer, поскольку он не имеет конструктора без параметров. Почему нет способа использовать XmlSerializer следующим образом:
new XmlSerializer(typeof(Foo)).Deserialize(stream,"some string");
Конечно, я мог бы реализовать свой собственный Сериализатор, который просто сохранит тип и все свойства и поля объекта, а затем будет использовать активатор для запуска объекта и установки ранее сохраненных свойств. Вопрос в следующем: будет ли это иметь смысл? Я предполагаю, что должна быть веская причина, потому что иначе это будет реализовано уже, верно?!?
XmlSerializer
работает с помощью генерации кода и динамической компиляции С#; потому что он использует компилятор С#, необходимо, чтобы генерируемый им код был скомпилирован - отметив, что он должен следовать правилам как отдельная сборка (без internal
или private
доступа).
В принципе, он хочет использовать new Foo()
, потому что он буквально испускает код С# "new Foo()"
который передается компилятору.
Да, он мог бы использовать другую технику создания экземпляров, но: new Foo()
- это авторы, которые решили пойти с ними - и это разумный вариант по умолчанию.
Некоторые другие сериализаторы предпочитают использовать Activator
, а другие все еще используют скрытые методы ИИ, которые обеспечивают прямой доступ к непубличным методам без какой-либо косвенности.