XmlSerializer & Activator.CreateInstance ()

1

Хорошо, мы все знаем, что использовать 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");

Конечно, я мог бы реализовать свой собственный Сериализатор, который просто сохранит тип и все свойства и поля объекта, а затем будет использовать активатор для запуска объекта и установки ранее сохраненных свойств. Вопрос в следующем: будет ли это иметь смысл? Я предполагаю, что должна быть веская причина, потому что иначе это будет реализовано уже, верно?!?

  • 0
    Обратите внимание , что должно быть «веская причина», а не «против» для функция будет реализована - см минус 100 баллов . То, что охватывает очень узкий случай (как вы предлагаете), редко может получить достаточно «очков» для реализации.
  • 0
    Лично я бы сказал, что заново изобретать колесо - это не так весело, как использовать существующее, отточенное решение, такое как protobuf-net, в котором отсутствуют эти ограничения.
Показать ещё 3 комментария
Теги:
serialization
activator

1 ответ

1

XmlSerializer работает с помощью генерации кода и динамической компиляции С#; потому что он использует компилятор С#, необходимо, чтобы генерируемый им код был скомпилирован - отметив, что он должен следовать правилам как отдельная сборка (без internal или private доступа).

В принципе, он хочет использовать new Foo(), потому что он буквально испускает код С# "new Foo()" который передается компилятору.

Да, он мог бы использовать другую технику создания экземпляров, но: new Foo() - это авторы, которые решили пойти с ними - и это разумный вариант по умолчанию.

Некоторые другие сериализаторы предпочитают использовать Activator, а другие все еще используют скрытые методы ИИ, которые обеспечивают прямой доступ к непубличным методам без какой-либо косвенности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню