Как установить значения по умолчанию для свойств динамически загружаемых типов во время выполнения для сериализации XML

Мне нужно сериализовать классы динамически загружаемых типов с помощью XMLSerializer.

При использовании сериализатора XML неинициализированные значения не сериализуются. У меня нет контроля над сборками, с которыми я работаю, поэтому я не могу использовать атрибуты XML для указания значений по умолчанию для свойств. Поэтому я думаю, что мне нужно рекурсивно установить для всех свойств и подсвойств их значения по умолчанию, а затем сериализовать. (Пожалуйста, дайте мне знать, если есть лучший способ)

Далее следует это:

Активатор.CreateInstance(propType);

но выше строка жалуется на отсутствие конструктора без параметров для некоторых типов.

Пробовал это: subObject = FormatterServices .GetUninitializedObject(propType); но этот дает ошибку «значение было недействительным» без внутреннего исключения.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person Erkan Y.    schedule 01.06.2010    source источник


Ответы (1)


Если рассматриваемые типы не имеют общедоступных конструкторов без параметров, у вас будут проблемы. Вы можете обойти проблему с атрибутами, используя конструктор перегрузка, которая принимает XmlAttributeOverrides объект, который можно использовать для полной настройки сериализатора, включая значение по умолчанию (через XmlAttributes.XmlDefaultValue), но есть вещи, которые вы не можете сделать, и обойти ограничения конструктора — одна из них.

Какой здесь сценарий?

  • если вы хотите xml, то я бы представил слой DTO: некоторые объекты, которые выглядят похожими на те, о которых вы говорите, но просты и находятся под вашим контролем. Идеально подходит для XmlSerializer. Затем вы пишете код для отображения между двумя
  • если вам просто нужна сериализация (а xml - это деталь реализации), то есть другие сериализаторы, которые могут помочь. DataContractSerializer или protobuf-net, например; любой из них был бы более универсальным здесь.
person Marc Gravell    schedule 01.06.2010