Обычно xsd2code делает неправильно (см. Ответ MizardX, почему, в конструкторе).
В качестве репродукции я использовал:
xsd foo.xsd /classes
для генерации классов (а не xsd2code), тогда следующий базовый пример работает абсолютно нормально:
using System;
using System.IO;
using System.Xml.Serialization;
static class Program
{
static void Main()
{
MH_CategoriesTree root = new MH_CategoriesTree(), clone;
root.response = new MH_CategoriesTreeResponse();
root.response.type = "alpha";
root.response.cat = new category
{
cat = new category
{
cat = new category
{
channel = new categoryChannel[]
{
new categoryChannel { id = 123, idSpecified = true }
}
},
channel = new categoryChannel [0]
},
channel = new categoryChannel[]
{
new categoryChannel { id = 456, idSpecified = true},
new categoryChannel { id = 789, idSpecified = true },
}
};
var ser = new XmlSerializer(typeof(MH_CategoriesTree));
string xml;
using(var sw = new StringWriter())
{
ser.Serialize(sw, root);
xml = sw.ToString();
}
using(var sr = new StringReader(xml))
{
clone = (MH_CategoriesTree) ser.Deserialize(sr);
}
// now write "clone" to Console, to show it all worked
ser.Serialize(Console.Out, clone);
}
}
Итак, варианты:
- использовать xsd.exe, а не xsd2code
- отправить отчет об ошибке для xsd2code
- возможно, вручную исправить созданный xsd2code конструктор, чтобы он не создавал дочерний элемент
category
Другая возможная причина рекурсии здесь проста: сделать вашу модель рекурсивной! например:
MH_CategoriesTree root = new MH_CategoriesTree(), clone;
root.response = new MH_CategoriesTreeResponse();
root.response.type = "alpha";
var cat = new category();
cat.cat = cat;
root.response.cat = cat; // now we have an infinite loop
, который, с остальным кодом, как указано выше, вызовет его взрыв в потоке искр:
Обнаружена круговая ссылка при сериализации объекта типа категории.
Однако рекурсивная схема сама работает просто отлично.