Способ XmlInclude автоматически для всех производных классов?

Очевидно, XmlSerializer работает гладко для объектов, если экземпляры не являются производными, в противном случае мне пришлось бы явно применить атрибут для включения определенных производных классов в базовый класс. У меня есть около 50+ производных классов и, возможно, еще больше в будущем, есть ли способ сказать XmlSerializer просто автоматически сериализовать производные части объекта и не мешать мне быть более явным с тем, что я хочу? Я просто хочу печатать меньше.

1 ответ

Необходимость их указания связана, в первую очередь, с трудностями их десериализации. В конце сериализации он может, в конце концов, пройтись по дереву наследования, чтобы найти информацию. Но подумайте о том, чтобы вас попросили десериализовать Foo, но получаю <bar> не сразу очевидно, как определить тип.

XmlSerializer разумно хочет быть уверенным, что он может выполнять оба действия - так же, как он хочет получить открытый конструктор без параметров, прежде чем он будет сериализован, когда явно сериализация не вызывает конструктор. Итак, в конечном счете: нет - вам придется рассказать это типам.

Обратите внимание, что это не означает, что вы можете использовать XmlIncludeAttribute - вы также можете предоставить эту информацию конструктору XmlSerializer (дополнительные типы). Однако IMO удобнее использовать атрибутный подход, и "меньше печатать", безусловно, не является веской причиной, чтобы не делать это таким образом. Кроме того, если вы используете что-то кроме конструктора XmlSerializer(Type), вам необходимо кэшировать сериализатор, чтобы предотвратить утечку сборок.

Я бы просто добавил атрибуты...

Другие вопросы по тегам