Используйте XmlElement
в «списке» древовидных ссылок.
[XmlElement("treelink")]
public TreeLink[] TreeLinks { get; set; }
Использование [XmlArray]
и [XmlArrayItem]
подразумевает, что вы хотите, чтобы ссылки на дерево находились в их собственном контейнере-обертке в родительском классе - другими словами, он ожидает xml, подобный этому:
<treelist id="foo" displayname="display">
<treelist>
<treelist id="link" />
</treelist>
</treelist>
Хитрость в том, чтобы всегда начинать в другом направлении. Разметьте ваш класс для сериализации, а затем сериализуйте экземпляр вашего типа и посмотрите на xml, который он генерирует. Затем вы можете настроить его так, чтобы он выглядел как XML, который вы в конечном итоге хотите десериализовать. Это гораздо проще, чем пытаться угадать, почему ваш xml не десериализован правильно.