Обновить

Комментарии 15

Вы перепутали habr и govnokod.ru.

Обоснуйте. Вы имеете полное право считать, что этой статье здесь не место, но код делает в точности то, что я от него хочу.

if (true.ToString().ToLower() == "true") {...} тоже делает, то, что автор хочет. Вопрос - "зачем"?

Я честно попытался прикинуть, в каком случае может понадобится ваш костыль - но ничего так и не придумалось. Можете дать пример, когда ваш костыль даёт хоть какую-то пользу перед другими сериализациями?

Ну для key\value существует Dictionary, который сереализуется в JSON и XML без всяких костылей, а если нужны Subitems, то легко положить в словарь и IEnumerable. Костыли они и на то костыли, что ими не хвастаются.

Как минимум, Dictionary не сохраняет порядок добавления.

OrderedDictionary

Да.

А как насчет вложенности?

Можно спокойно добавить любую коллекцию в словарь.

Вложенность больше двух уровней.

Напишите все вводные сразу, а не по одному сообщению

Кто мешает делать вложенность больше двух уровней, кстати?

OrderedDictionary<Key, object?>

Но как уже выше сказали - нужны все вводные.

Вообще-то, я всегда сериализовал в XML вручную, и когда сейчас глянул в документацию, понял, что не представляю возможностей штатной сериализации стандартных контейнеров.

Могли бы вы представить этот пример через Dictionary, и каков будет результат сериализации в XML?

IEnumerable GetTypeInfo(Type type) {
return new NVItem[] {
new NVItem("Name", type.Name),
new NVItem("FullName", type.FullName),
new NVItem("CustomAttributes", type.CustomAttributes),
};
}

Опять не с того конца.

Какой результат хочется получить?

Нужно конкретный набор объектов сериализовать в xml без какой-то предопределённой структуры, чтобы потом по этому xml воссоздать исходные объекты?

Или же нужно какую-то предопределённую структуру в xml выразить в коде?

https://learn.microsoft.com/en-us/dotnet/standard/serialization/xml-and-soap-serialization

Стандартными средствами можно обоими путями пойти.

Если хочется просто сериализовать и не важно во что, то все стандартные коллекции вполне поддаются сериализации в XML.

Classes that implement ICollection or IEnumerable.

Если хочется что-то конкретное, то гибче всего - руками построить XmlDocument с нужной структурой.

Справедливо и в обратную сторону.

Да. Сериализовать вручную - через XmlDocument.

По штатной сериализацией я имел в ввиду что-то вроде:
var serializer = new XmlSerializer(typeof(NVItem));
но это требует слишком много усилий, по сравнению с ручным методом.

Кроме того, если требуется сериализовать лишь некоторые поля, нам все равно придется использовать некоторый промежуточный носитель.

Я хорошо представляю, как можно вместо NVItem использовать комбинацию Dictionary и List, и затем сериализовать это через XmlDocument.

Мой вопрос в том - можно ли такую комбинацию сходу подставить в XmlSerilizer?

Сериализовать вручную настолько проще, что нет смысла пытаться написать такое с нуля, но если у вас уже есть работающий код, было бы любопытно его увидеть.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации