Это немного длинный вопрос, но я сделал его как можно более кратким, поэтому, пожалуйста, потерпите меня. Мне кажется, что это ошибка в классе XmlSerializer
, но прежде чем я подам ее в Microsoft, я бы хотел посмотреть, пропустил ли я что-нибудь, что вполне возможно.
Я пытаюсь сгенерировать следующий XML в качестве типичного случая, который по сути является коллекцией коллекций, но где внешняя коллекция имеет дополнительные элементы:
<Links>
<Name />
<Group>
<Link />
<Link />
</Group>
<Group>
<Link />
<Link />
</Group>
</Links>
Классы сериализации следующие:
public class Link { }
public class Links
{
public string Name { get; set; }
[XmlElement("Group")]
public Link[][] Groups { get; set; }
}
А простая тестовая программа для ее запуска выглядит следующим образом:
class Program
{
static void Main()
{
var serializer = new XmlSerializer(typeof(Links));
var links = new Links { Name = "", Groups = new[] {
new[] { new Link(), new Link() },
new[] { new Link(), new Link() } } };
serializer.Serialize(Console.Out, links);
}
}
При этом используется прием с использованием XmlElement
для удаления родительского узла коллекции , что должно означать, что элемент <Groups>
не генерируется, и для каждого объекта, содержащегося во внешнем массиве (который будет иметь тип Link[]
) должен быть выделен элемент <Group>
. Однако во время выполнения это дает следующее исключение из XmlSerializer
:
Невозможно создать временный класс (результат = 1).
ошибка CS0030: невозможно преобразовать тип 'Link [] []' в 'Link []'
ошибка CS0029: невозможно неявно преобразовать тип 'Link []' в 'Link [] []'
Я предполагаю, что сериализатор по какой-то причине пытается сгладить коллекцию и думает, что тип, содержащийся во внешнем массиве, равен Link
, а не Link[]
, что вызывает сбой компиляции его классов сериализации как типов не совпадают.
Что ты думаешь? Это ошибка? И есть ли обходной путь для генерации XML, который я использую после XmlSerializer
?