Ну, в первом случае написанный XML выглядит примерно так:
<Barn>
<Horse>
<Rider xsi:nil="true" xmlns="abc" />
</Horse>
</Barn>
Однако во втором случае XML выглядит так:
<Barn>
<Horse />
</Barn>
Итак, во втором случае, по существу, то, что происходит во время десериализации, таково:
Barn barn = new Barn();
barn.Hose = new Horse();
И так, потому что мы устанавливаем Rider по умолчанию в конструкторе, он остается "Джим Крейг".
Интересно то, что поведение можно изменить, просто изменив порядок элементов в Barn
. Чтобы узнать больше, мы можем покопаться, используя ILSpy и Sgen.exe - просто запустите sgen
для нашей сборки и посмотрите на сгенерированную сборку.
Мы обнаружили, что в первом случае сгенерированный код в обоих Write2_Horse
и Write3_Motorcycle
методах имеет строку, которая выглядит следующим образом:
base.WriteNullableStringLiteral("Rider", "abc", o.Rider);
Однако во втором случае это выглядит так:
base.WriteElementString("Rider", "abc", o.Rider);
Я не вижу никакой причины, почему изменение порядка элементов, подобных этому, должно изменить поведение сериализации обоих элементов Horse
и Motorcycle
таким образом, так что вкратце это выглядит для меня как ошибка в генераторе сборки сериализации XML.
Вы, вероятно, должны сообщить об этом в Microsoft: -)