Необходимость их указания объясняется в первую очередь сложностью необходимости десериализации их. В конце сериализации он может, в конце концов, пройтись по дереву наследования, чтобы найти информацию. Но подумайте о том, что вас попросили десериализовать Foo
, но, получив <bar>
, не сразу понятно, как определить тип.
XmlSerializer разумно хочет быть уверенным, что он может выполнять оба действия - так же, как он хочет получить открытый конструктор без параметров, прежде чем он будет сериализован, когда ясно, что сериализация не вызывает конструктор. Итак, в конечном итоге: нет - вам придется сказать это типам.
Обратите внимание, что это не означает, что вы можете использовать XmlIncludeAttribute - вы также можете предоставить эту информацию конструктору XmlSerializer (дополнительные типы). Тем не менее, в IMO удобнее использовать атрибутивный подход, и «меньше печатать», безусловно, не является веской причиной, чтобы не делать это таким образом. Кроме того, при использовании чего-либо, кроме конструктора XmlSerializer (Type), необходимо кэшировать сериализатор, чтобы предотвратить утечку сборок.
Я бы просто добавил атрибуты ...