Это действительно ответ @ WaldemarGałęzinowski, https://stackoverflow.com/a/35896991/157224 немного расширился.
xsd.exe
имеет оптимизацию, которая срабатывает, когда у вас есть единственный неограниченный элемент без атрибута в последовательности.
![Родитель-Дочерний](https://i.stack.imgur.com/LqUlH.png)
Оптимизация позволит избежать создания специального типа для родительского элемента и вместо этого сделает его массивом дочерних элементов.
ChildType[] Parent { get; set; }
вместо ParentType Parent { get; set; }
, и вы получаете доступ к дочерним элементам как Parent[0]
вместо Parent.Child[0]
. (Иногда я нахожу эту оптимизацию немного запутанной)
Здесь происходит еще один уровень неограниченного элемента без атрибутов.
![Родитель-ребенок-внук](https://i.stack.imgur.com/9xwAv.png)
Оптимизация применяется дважды, в результате получается GrandChildType[][] Parent {get; set;}
, и вы получаете доступ к своему любимому первому внуку, например, Parent[0][0]
вместо Parent.Child[0].GrandChild[0]
.
Проблема в том, что сериализатор .Net не поддерживает массивы массивов и генерирует недопустимый код.
Я понятия не имею, почему Microsoft не исправляла эту ошибку все эти годы, но решение простое.
Просто заставьте xsd.exe
сгенерировать класс для родителя или потомка, добавив в последовательность необязательный атрибут или необязательный элемент. например ![обходной путь](https://i.stack.imgur.com/bgFqK.png)
Что приводит к Parent[0].GrandChild[0]
person
adrianm
schedule
04.02.2021