XML - C# Уроки - Сериализация объектов в XML.
Вставка
- Опубліковано 6 жов 2024
- В этом видео уроке по c#, я расскажу что такое XML, зачем он нужен и как можно сериализировать различные типы объектов на c# в XML формат и обратно десериализировать xml формат в понятный для программы объект.
Сериализации подлежит любой тип коллекции, любые массивы и классы. Кстати, в видео ролике я забыл упомянуть, что при сериализации класса, будут обработаны лишь те поля которые имеют модификатор доступа public, поля с модификатором доступа private будут попросту игнорироваться.
Все мои уроки программирования: • Video
Все уроки по созданию пользовательского интерфейса со всеми user control'ами: • C# обучение - User Con...
Во видео-уроке я использую:
• Среда разработки Visual Studio 2017
• Язык программирования .NET C#
Я очень рад, если видео "XML - C# Уроки - Сериализация объектов в XML." было Вам полезно.
Хотите поблагодарить меня? - Жмите кнопку "Мне понравилось" и скиньте ссылку на урок друзьям или сделайте репост на свою страницу в соц. сети. Это будет самая лучшая благодарность и мотивация продолжать делать для вас видео-уроки по c#.
Подписывайтесь на мой канал:
www.youtube.co...
#XML #Сериализация #Egolds
*➤ Стань моим Патроном:* *www.patreon.com/egolds*
Репозиторий с проектом из видео Сериализация объектов в XML на C#:
github.com/Egolds/csharp_xml_serialization
Группа в Вконтакте: vk.com/eegolds
Очень толковый урок, хорошая и спокойная подача материала. Спасибо.
Спасибо большое за комментарий)
Спасибо чел, ты мне помог понять вообще, что такое xml файл и как его создать
Агонь, 2 дня сидел над универской лабой, читал документации, пытался что-то делать а тут за часик всё полностью сделал, спасибо большое)
Спасибо за комментарий!)
Я очень рад что мои видео приносят пользу =)
@@egolds Да, действительно, очень полезные ролики, многого набрался с этого канала. Полно всяких каналов, где информация ценная, а вот подача...(шипящий микрофон, кашли, голос, будто у человека гайморит....)
Спасибо огромнейшее! Всё чётко и понятно! Подписка и лайк)
Этот ролик - настоящая цифровая магия! Завораживает!
Чел, ты сделал мою курсовую. Ты просто лучший!
Ахаха) Супер!
Спасибо =)
Благодарю от всей души.
Нереально полезный материал! Продолжай в том же духе! Успехов тебе!:3
Спасибо большое)
Спасибо большое 🙏 очень помогли с курсовой..)
Пожалуйста)
Спасибо за видео. Классные уроки и отличная подача материала. По моему только так и нужно преподносить инфу, без лишних эмоций и слов.
Пожалуйста)
И спасибо за комментарий)
Все четко, крайне полезно знать такую тему🔥
Спасибо)
Отличный урок!
Спасибо большое)
Спасибо за полезный и качественный урок!
Пожалуйста) и спасибо за комментарий)
@@egolds Скажите пожалуйста, как вывести значения еще и в комбобокс? Например username
Спасибо. Очень понравилось.
Пожалуйста, я очень рад)
И спасибо за комментарий!
Если бы вы еще с вашей отличной подачей материала показали как тащить данные из существующей базы данных на удаленном сервере, было бы ваааще супер!
@@ivannarykin Хмм, меня уже кто-то просил такое сделать, так что я обязательно постараюсь снять ролик об этом =)
Крутяк
Спасибо)
Проблемы со свойством "Tag" , "object" не содержит такого определения. В кнопке добавить ошибки нет, а на проверке при нажатии на список выскакивает эта ошибка
#💪💪
Спасибо.
Пожалуйста
класній урок,не словил момент где ты прописал путь куда файл будет сахранен
10/11
Спасибо)
@@egolds 💪😉
Ролик полезный, но есть вопрос, можно ли как-либо редактировать созданный xml файл, чтобы если человек, например, не ввел возраст, он мог добавить добавить его потом?
Сериализация - это способ передачи сложных данных между программами, поэтому файл (в данном случае XML) не предназначен для ручного редактирования. Чтобы данные сохранялись в правильном формате, т.е. без ошибок, которые пользователь может наделать при вводе, их (данные) нужно программно проверять (валидировать). Это гарантирует корректность (достоверность) и полноту (избыточность) данных.
А зачем каждый раз создавать новый объект XmlSerializer ? Разве нельзя его создать в шапке и обращаться к нему из метода?
Верно подметил! Можно)
Здравствуйте, уважаемый Egolds! Огромное спасибо за столь полезный ролик, та же задача, универская лаба. Куча головной боли, куча материалов в интернете и только Ваш ролик помог!!! Но есть вопрос, а как возможно имплементировать checkbox/radiobutton? Не получается передать их ни через Text/SelectedItem/Value. 😢 Спасибо!
Благодарю, для checkbox/radiobutton нужно использовать тип данных bool и в методе чтения/записи читаем/записываем из/в нужного/ное поле значение.
Или я не совсем понял задачу
Больше спасибо! Не подскажете как сделать, что бы каждый пользователь записывался в отдельный XML файл?
В таком случае, класс Users не нужен.
Кликом по кнопку Serialize нужно выполнить сериализацию для каждого пользователя, вот примерно таким образом:
foreach(ListViewItem item in lvUsers.Items)
{
if(item.Tag != null)
{
users.UsersList.Add((User)item.Tag);
}
SerializeUsers((User)item.Tag, user.Username + ".xml"); // проблема может возникнуть если будут одинаковые имена, так что нужно другое название файла, а потом каким-то образом читать эти файлы
}
и вместо метода SerializeXML, нужно сделать вот такой
private void SerializeUser(User user, string fileName)
{
XmlSerializer xml = new XmlSerializer(typeof(User));
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
{
xml.Serialize(fs, user);
}
}
* Писал с телефона, могут быть ошибки.
@@egolds Разобрался, огромное спасибо за ответ)
Что делать, если при добавлении данных в лист вью, они их всех выводит в одну строку, а не в столбец?
И как реализовать удаление выделенного элемента листвью из XML? Не получается (удаляется только название и вся структура хмл летит) Помогите пожалуйста
Нужно удалять выделенный элемент с помощью метода Remove вроде, а затем снова сериализировать коллекцию элементов
@@egolds все равно не получается. Какие бы способы удаления не использовал xml летит
a
a
0
0
a
ord>b // вот тут бага
b
0
0
b
@@kurnakovv Напиши мне в группе в ВК, и скинь код, как именно ты делаешь удадение
@@egolds спасибо, уже не надо, я просто добавил удаление всего xml перед сериализацией, не знаю на сколько это практично, но главное что работает)) Еще раз спасибо за обратную связь!
@@kurnakovv Хорошо, пожалуйста)
а я могу передать в xml информацию с Label???
Уважаемый Egolds, снова я к вам с вопросом. Сериализировать XML с вашей помощью у меня получилось. Еще раз спасибо. Но подскажите пожалуйста, как быть если требуется XML, сформированный не:
3
Мужская одежда
, а в таком виде:
Мужская одежда
?
Заранее спасибо!
Показываю на примере поля Username класса User.
В данный момент данное поле выглядит так:
public string Username { get; set; }
Но нам необходимо создать отдельный класс для этого поля.
Класс:
[Serializable]
public class UsernameValue
{
[XmlText]
public string Username { get; set; }
[XmlAttribute]
public string id { get; set; }
public UsernameValue() { }
public UsernameValue(string Username, string id)
{
this.Username = Username;
this.id = id;
}
}
Теперь вместо public string Username { get; set; } используем:
public UsernameValue Username { get; set; }
В итоге после сериализации получаем:
ааааа
@@egolds Круто! Получается, надо через ХМЛатрибуты? Буду пробовать. Большое спасибо!
@@ivannarykin Пожалуйста) Да, необходимо указать атрибут XmlAttribute
@@egolds
Добрый день, Egolds, как только я уже подумал что справился со всеми трудностями, как упёрся вот в такую сложность. Есть класс "offer" со списком "pictures" внутри с типом данных "string".
Результат в файле выглядит вот так:
0505-0000-0171.jpg
0505-0000-0171-2.jpg
0505-0000-0171-3.jpg
А структура должна быть такой:
0505-0000-0171.jpg
0505-0000-0171-2.jpg
0505-0000-0171-3.jpg
Майкрософтовскую документацию читал, но решения не нашел.
Вариантов кроме как список описать отдельным классом у меня нет, но не очень хочется делать трехэтажную структуру.
Может можно опять как-то через атрибуты? Может вы подскажете более легкий вариант?
@@ivannarykin да, нужно также добавить атрибут.
Два варианта, вот первый, который скорее всего вам подойдёт:
(На том же примере)
[XmlElement("picture")] // Вот этот атрибут, вместо picture можно написать что угодно
public List Pictures { get; set; }
Результат:
0505-0000-0171.jpg
0505-0000-0171-2.jpg
0505-0000-0171-3.jpg
Либо второй вариант:
[XmlArrayItem("picture")] // С этим атрибутом сохраняется узел списка Pictures
public List Pictures { get; set; }
Результат:
0505-0000-0171.jpg
0505-0000-0171-2.jpg
0505-0000-0171-3.jpg
Доброго времени суток. Если я не ошибаюсь, то на 2 мин 36 сек вашего видео, вы создаете пустой конструктор. Вы могли бы объяснить зачем? Спасибо.
------- спустя час я дописал это сообщение:
Изначально я посчитал что этот конструктор не нужен и не писал его. Без него у меня не работал метод serializeXML. Программа ругалась на тип данных передаваемого в метод аргумента. После "150го" пересмотра видео решил попробовать его добавить и, вуаля! Программа сгенерила XML файл! Я доволен. Но, связи этого конструктора с работой метода понять так и не могу. Буду благодарен если растолкуете. Заранее спасибо.
Доброго времени суток.
Класс, реализующий интерфейс, должен иметь конструктор без параметров. Это требование класса XmlSerializer (из. документации).
Но вроде бы, при сериализации, если класс не содержит конструкторов с параметрами, то можно обойтись без конструктора который не содержит параметров.
Как и говорил выше, просто XmlSerializer для сериализации требует наличие такого конструктора, для понимания объекта. Я четно говоря не вникал в это, просто взял за правило. Извиняюсь за столь исчерпывающий ответ)
@@egolds Спасибо
Почему-то если установить это приложение на комп и запускать уже не через VS выдаёт "необрабатываемое исключение в приложении", из-за чего это может быть, может путь указан не правильно? При том, что в VS проект запускается, строки сериализуются и десериализуются??
Не могу сказать, нужен полный стэк исключения. И на какую строку указывает?
Здравствуйте! Как проверить совпадения в методе Add() ? если уже есть такое имя, то вывести сообщение (Такое имя уже используется")
Если рассматривать данный пример, то можно пройтись по всем элементам ListView, и проверять Tag.
// Вот это добавить надо в метод Add
for(int i =0; i < lvUsers.Items.Count; i++)
{
if ((lvUsers.Items[i].Tag as User).Username == user.Username)
{
// Сообщение что уже есть такое имя
return;
}
2:11
Добрый день!
Всвязи с блокировкой телеграмма ботнет не может подключиться через ВПН. Есть ли аналоги телеграфа?
Если есть решение проблемы может запишите видео
Добрый день, вот тут есть ссылки, возможно будут полезны: teletype.in/@guru_telegram/ryEdz0b6M
А так, постараюсь что-нибудь придумать, можно добавить в ботнет использование прокси, тоже могу видео записать.
Egolds благодарю, а прокси были бы очень кстати
@@markplay927 понял, сделаю)
Egolds, не могу сериализировать в XML файл текущие дату и время. Этот вопрос точно вам посилен. Поможете? )))
Дату стоит хранить в отдельном поле, и дать ему атрибут игнорирования, а сериализировать поле с типов string, пример:
[XmlIgnore]
// Игнорируем поле ниже
public DateTime hiddenFieldDateTime { get; set; }
[XmlElement("SomeDate")] // Замена названия поля в xml файле
public string SomeDateString
{
get { return hiddenFieldDateTime.ToString("yyyy-MM-dd HH:mm:ss"); }
// можно сделать любой формат
set { hiddenFieldDateTime = DateTime.Parse(value); }
}
@@egolds И снова огромное спасибо. Цель достигнута. Не получилось только заменить название поля, так как я это поле использовал как атрибут: . Но, я вышел из положения просто назвав стринговую переменную "date". :)
И не совсем понятно что делает эта строка: set { hiddenFieldDateTime = DateTime.Parse(value); }
Супер. Спасибо. Я ваш должник! ;)
Пожалуйста) В данном случае поле SomeDateString является свойством, которое может иметь геттеры и сеттеры (get, set) в старших версиях, нельзя было создавать автоматических свойств типа
public string Prop {get; set;}
Нужно было создавать дополнительное поле хранящее содержимое:
public string Prop
{
get { return prop; }
set { prop = value }
}
private string prop = string.Empty;
value - это вводимое содержимое.
В это строке
set { hiddenFieldDateTime = DateTime.Parse(value); }
мы полю hiddenFieldDateTime присваиваем значение value, предварительно спарсив его в тип DateTime
@@egolds Ясно! Еще раз огромное спасибо! Ждём новых видео! ;)
Это если файл существует в твоей папке, то можно десериализовать, а если в бд находится, в поле хмл ?
Необходимо просто загрузить из поля бд в переменную как string и выполнить десериализацию.
И в таком случае использовать FileStream не нужно, просто return (Users)xml.Deserialize(сюда переменная со строкой из базы);
@@egolds спасибо
@@Собственник-т3к пожалуйста)
Целый int для хранение только даух чисел (1 или 0)???
Да ладно, суть то не в этом)
@@egolds Просто школота перепишет даже не задумываясь. А потом будут долго препаду обьеснять почему так ))
@@sergejsjermakovs9619 по хорошему надо для этого отдельную структуру сделать
или энам, кстати
Уважаемый Egolds, после сериализации файл выглядит как нужно, а вот декларация отображает только версию: . Сегодня за вес день голову сломал над тем как отобразить еще и кодировку, но безрезультатно. Может вы подскажете?
Да, знаю как сделать это, завтра постараюсь написать
@@egolds Решил вопрос сериализуя данные через TextWriter. Там utf-8 по умолчанию используется и отображается. Спасибо!
привет,помоги.. почему сериализуется только если много объектов в listview? а если один обект то записывает в файл просто как строку (стринг стринг...), почему может такое быть?
А какие изменения ты делал в проекте который я дал? Потому что у меня записывает правильно, даже когда добавлен лишь один объект. Или ты делаешь сериализацию в своем проекте? Если так, тогда покажи, как ты выполняешь сериализацию? Какой тип данных используется при определении объекта класса XmlSerializer?
@@egolds изменения в том что я использую listbox(что почти то же самое что и (listView)
и добавляю туда объект из itemsSource, и в butonadd_click(object sender, RoutedEventArgs e)
{
User user = new User ("a", "b", 1);
userlistbox.items.add(user);
/// без использования tag
}
потом в SerialButton_Click(object sender, RoutedEventArgs e)
{
Users users = new Users();
foreach (user in userlistbox.Items)
// вместо listview использую class
{
users.userslist.Add(user);
}
SerializeXml(lpc);
}
при добавлении множества объекта то работает нормально, а если один или два items в listbox
то в xml записывает только одну строку:
a b 1
если два объекта :
a b 1 a b 1
если штук 10 то нормально в xml пишет и десериализует тоже нормально
Окей, а каким изменениям подвергся класс User?
@@egolds никаким
Это ты в WPF делаешь?
Загрузи проект на github и дай мне ссылку, я исправлю
Не секс- а Гендер ))))
ты куда так гонишь? ниче не обьясняешь! для кого снял? для себя что ли?
Это я экспериментировал, хотел сделать чтобы не так скучно было
@@egolds я думала, что попала на обучающее, а не на развлекательное видео
Всё верно, ролик сделан с целью научить, поделиться знаниями. Но обучающий материал не означает, что он должен быть скучным. Вот я попытался сделать такую подачу. С нового года начну снова публиковать ролики, постараюсь поработать ещё над подачей
@@egolds будет здорово, продолжай развиваться и все у тебя получится
Приятно, спасибо)