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

КОМЕНТАРІ • 121

  • @egolds
    @egolds  5 років тому +2

    *➤ Стань моим Патроном:* *www.patreon.com/egolds*
    Репозиторий с проектом из видео Сериализация объектов в XML на C#:
    github.com/Egolds/csharp_xml_serialization
    Группа в Вконтакте: vk.com/eegolds

  • @samana1407
    @samana1407 4 роки тому +2

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

    • @egolds
      @egolds  4 роки тому

      Спасибо большое за комментарий)

  • @АнтонМатюнин-ь7п
    @АнтонМатюнин-ь7п 2 роки тому

    Спасибо чел, ты мне помог понять вообще, что такое xml файл и как его создать

  • @nikellgame8661
    @nikellgame8661 4 роки тому +1

    Агонь, 2 дня сидел над универской лабой, читал документации, пытался что-то делать а тут за часик всё полностью сделал, спасибо большое)

    • @egolds
      @egolds  4 роки тому +2

      Спасибо за комментарий!)
      Я очень рад что мои видео приносят пользу =)

    • @UnstableMachine
      @UnstableMachine 4 роки тому

      @@egolds Да, действительно, очень полезные ролики, многого набрался с этого канала. Полно всяких каналов, где информация ценная, а вот подача...(шипящий микрофон, кашли, голос, будто у человека гайморит....)

  • @МинистрОбороны-р5л

    Спасибо огромнейшее! Всё чётко и понятно! Подписка и лайк)

  • @abogad
    @abogad 3 роки тому +1

    Этот ролик - настоящая цифровая магия! Завораживает!

  • @bk-uz5cs
    @bk-uz5cs 4 роки тому

    Чел, ты сделал мою курсовую. Ты просто лучший!

    • @egolds
      @egolds  4 роки тому +1

      Ахаха) Супер!
      Спасибо =)

  • @pe4enushk0
    @pe4enushk0 3 роки тому

    Благодарю от всей души.

  • @SHILY-PROJECT
    @SHILY-PROJECT 4 роки тому +1

    Нереально полезный материал! Продолжай в том же духе! Успехов тебе!:3

    • @egolds
      @egolds  4 роки тому

      Спасибо большое)

  • @StephaniOgu
    @StephaniOgu 4 роки тому +1

    Спасибо большое 🙏 очень помогли с курсовой..)

    • @egolds
      @egolds  4 роки тому +2

      Пожалуйста)

  • @АлексДронго-х3к
    @АлексДронго-х3к 5 років тому

    Спасибо за видео. Классные уроки и отличная подача материала. По моему только так и нужно преподносить инфу, без лишних эмоций и слов.

    • @egolds
      @egolds  5 років тому +1

      Пожалуйста)
      И спасибо за комментарий)

  • @romanrudman5102
    @romanrudman5102 5 років тому

    Все четко, крайне полезно знать такую тему🔥

    • @egolds
      @egolds  5 років тому +1

      Спасибо)

  • @ВиталийСак-к6й
    @ВиталийСак-к6й 4 роки тому

    Отличный урок!

    • @egolds
      @egolds  4 роки тому

      Спасибо большое)

  • @antonmartynenko8795
    @antonmartynenko8795 4 роки тому +1

    Спасибо за полезный и качественный урок!

    • @egolds
      @egolds  4 роки тому

      Пожалуйста) и спасибо за комментарий)

    • @dicksom
      @dicksom 3 роки тому

      @@egolds Скажите пожалуйста, как вывести значения еще и в комбобокс? Например username

  • @ivannarykin
    @ivannarykin 4 роки тому

    Спасибо. Очень понравилось.

    • @egolds
      @egolds  4 роки тому

      Пожалуйста, я очень рад)
      И спасибо за комментарий!

    • @ivannarykin
      @ivannarykin 4 роки тому

      Если бы вы еще с вашей отличной подачей материала показали как тащить данные из существующей базы данных на удаленном сервере, было бы ваааще супер!

    • @egolds
      @egolds  4 роки тому +2

      @@ivannarykin Хмм, меня уже кто-то просил такое сделать, так что я обязательно постараюсь снять ролик об этом =)

  • @multicat3534
    @multicat3534 5 років тому +1

    Крутяк

    • @egolds
      @egolds  5 років тому

      Спасибо)

  • @egorantonov504
    @egorantonov504 Рік тому +1

    Проблемы со свойством "Tag" , "object" не содержит такого определения. В кнопке добавить ошибки нет, а на проверке при нажатии на список выскакивает эта ошибка

  • @RMBTB
    @RMBTB 5 років тому +2

    #💪💪

  • @Дмитрийсекрет-н7о
    @Дмитрийсекрет-н7о 5 років тому +1

    Спасибо.

    • @egolds
      @egolds  5 років тому

      Пожалуйста

  • @oilondabeats9011
    @oilondabeats9011 2 роки тому

    класній урок,не словил момент где ты прописал путь куда файл будет сахранен

  • @RMBTB
    @RMBTB 5 років тому +1

    10/11

    • @egolds
      @egolds  5 років тому +1

      Спасибо)

    • @RMBTB
      @RMBTB 5 років тому +1

      @@egolds 💪😉

  • @СоломонЗуев-я2л
    @СоломонЗуев-я2л 2 роки тому +1

    Ролик полезный, но есть вопрос, можно ли как-либо редактировать созданный xml файл, чтобы если человек, например, не ввел возраст, он мог добавить добавить его потом?

    • @СергейЩербаков-к5я
      @СергейЩербаков-к5я Рік тому

      Сериализация - это способ передачи сложных данных между программами, поэтому файл (в данном случае XML) не предназначен для ручного редактирования. Чтобы данные сохранялись в правильном формате, т.е. без ошибок, которые пользователь может наделать при вводе, их (данные) нужно программно проверять (валидировать). Это гарантирует корректность (достоверность) и полноту (избыточность) данных.

  • @c1q3
    @c1q3 4 роки тому +2

    А зачем каждый раз создавать новый объект XmlSerializer ? Разве нельзя его создать в шапке и обращаться к нему из метода?

    • @egolds
      @egolds  4 роки тому +3

      Верно подметил! Можно)

  • @constancegerman
    @constancegerman Рік тому

    Здравствуйте, уважаемый Egolds! Огромное спасибо за столь полезный ролик, та же задача, универская лаба. Куча головной боли, куча материалов в интернете и только Ваш ролик помог!!! Но есть вопрос, а как возможно имплементировать checkbox/radiobutton? Не получается передать их ни через Text/SelectedItem/Value. 😢 Спасибо!

    • @egolds
      @egolds  Рік тому

      Благодарю, для checkbox/radiobutton нужно использовать тип данных bool и в методе чтения/записи читаем/записываем из/в нужного/ное поле значение.
      Или я не совсем понял задачу

  • @mrDn1we
    @mrDn1we 3 роки тому

    Больше спасибо! Не подскажете как сделать, что бы каждый пользователь записывался в отдельный XML файл?

    • @egolds
      @egolds  3 роки тому +1

      В таком случае, класс 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);
      }
      }
      * Писал с телефона, могут быть ошибки.

    • @mrDn1we
      @mrDn1we 3 роки тому

      @@egolds Разобрался, огромное спасибо за ответ)

  • @ЛеонидТанеев-ц3в

    Что делать, если при добавлении данных в лист вью, они их всех выводит в одну строку, а не в столбец?

  • @Violetta124246
    @Violetta124246 4 роки тому +1

    И как реализовать удаление выделенного элемента листвью из XML? Не получается (удаляется только название и вся структура хмл летит) Помогите пожалуйста

    • @egolds
      @egolds  4 роки тому

      Нужно удалять выделенный элемент с помощью метода Remove вроде, а затем снова сериализировать коллекцию элементов

    • @kurnakovv
      @kurnakovv 3 роки тому

      @@egolds все равно не получается. Какие бы способы удаления не использовал xml летит
      a
      a
      0
      0
      a
      ord>b // вот тут бага
      b
      0
      0
      b

    • @egolds
      @egolds  3 роки тому

      @@kurnakovv Напиши мне в группе в ВК, и скинь код, как именно ты делаешь удадение

    • @kurnakovv
      @kurnakovv 3 роки тому

      @@egolds спасибо, уже не надо, я просто добавил удаление всего xml перед сериализацией, не знаю на сколько это практично, но главное что работает)) Еще раз спасибо за обратную связь!

    • @egolds
      @egolds  3 роки тому +1

      @@kurnakovv Хорошо, пожалуйста)

  • @АнтонМатюнин-ь7п
    @АнтонМатюнин-ь7п 2 роки тому

    а я могу передать в xml информацию с Label???

  • @ivannarykin
    @ivannarykin 4 роки тому

    Уважаемый Egolds, снова я к вам с вопросом. Сериализировать XML с вашей помощью у меня получилось. Еще раз спасибо. Но подскажите пожалуйста, как быть если требуется XML, сформированный не:
    3
    Мужская одежда
    , а в таком виде:
    Мужская одежда
    ?
    Заранее спасибо!

    • @egolds
      @egolds  4 роки тому +2

      Показываю на примере поля 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; }
      В итоге после сериализации получаем:
      ааааа

    • @ivannarykin
      @ivannarykin 4 роки тому

      @@egolds Круто! Получается, надо через ХМЛатрибуты? Буду пробовать. Большое спасибо!

    • @egolds
      @egolds  4 роки тому

      @@ivannarykin Пожалуйста) Да, необходимо указать атрибут XmlAttribute

    • @ivannarykin
      @ivannarykin 4 роки тому

      @@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

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

    • @egolds
      @egolds  4 роки тому

      @@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

  • @ivannarykin
    @ivannarykin 4 роки тому

    Доброго времени суток. Если я не ошибаюсь, то на 2 мин 36 сек вашего видео, вы создаете пустой конструктор. Вы могли бы объяснить зачем? Спасибо.
    ------- спустя час я дописал это сообщение:
    Изначально я посчитал что этот конструктор не нужен и не писал его. Без него у меня не работал метод serializeXML. Программа ругалась на тип данных передаваемого в метод аргумента. После "150го" пересмотра видео решил попробовать его добавить и, вуаля! Программа сгенерила XML файл! Я доволен. Но, связи этого конструктора с работой метода понять так и не могу. Буду благодарен если растолкуете. Заранее спасибо.

    • @egolds
      @egolds  4 роки тому

      Доброго времени суток.
      Класс, реализующий интерфейс, должен иметь конструктор без параметров. Это требование класса XmlSerializer (из. документации).
      Но вроде бы, при сериализации, если класс не содержит конструкторов с параметрами, то можно обойтись без конструктора который не содержит параметров.

    • @egolds
      @egolds  4 роки тому

      Как и говорил выше, просто XmlSerializer для сериализации требует наличие такого конструктора, для понимания объекта. Я четно говоря не вникал в это, просто взял за правило. Извиняюсь за столь исчерпывающий ответ)

    • @ivannarykin
      @ivannarykin 4 роки тому

      @@egolds Спасибо

  • @АлексейМелентьев-ч3в

    Почему-то если установить это приложение на комп и запускать уже не через VS выдаёт "необрабатываемое исключение в приложении", из-за чего это может быть, может путь указан не правильно? При том, что в VS проект запускается, строки сериализуются и десериализуются??

    • @egolds
      @egolds  4 роки тому

      Не могу сказать, нужен полный стэк исключения. И на какую строку указывает?

  • @Violetta124246
    @Violetta124246 4 роки тому

    Здравствуйте! Как проверить совпадения в методе Add() ? если уже есть такое имя, то вывести сообщение (Такое имя уже используется")

    • @egolds
      @egolds  4 роки тому

      Если рассматривать данный пример, то можно пройтись по всем элементам ListView, и проверять Tag.
      // Вот это добавить надо в метод Add
      for(int i =0; i < lvUsers.Items.Count; i++)
      {
      if ((lvUsers.Items[i].Tag as User).Username == user.Username)
      {
      // Сообщение что уже есть такое имя
      return;
      }

  • @ALESHAKAN
    @ALESHAKAN 4 місяці тому

    2:11

  • @markplay927
    @markplay927 5 років тому

    Добрый день!
    Всвязи с блокировкой телеграмма ботнет не может подключиться через ВПН. Есть ли аналоги телеграфа?
    Если есть решение проблемы может запишите видео

    • @egolds
      @egolds  5 років тому

      Добрый день, вот тут есть ссылки, возможно будут полезны: teletype.in/@guru_telegram/ryEdz0b6M
      А так, постараюсь что-нибудь придумать, можно добавить в ботнет использование прокси, тоже могу видео записать.

    • @markplay927
      @markplay927 5 років тому

      Egolds благодарю, а прокси были бы очень кстати

    • @egolds
      @egolds  5 років тому

      @@markplay927 понял, сделаю)

  • @ivannarykin
    @ivannarykin 4 роки тому

    Egolds, не могу сериализировать в XML файл текущие дату и время. Этот вопрос точно вам посилен. Поможете? )))

    • @egolds
      @egolds  4 роки тому +1

      Дату стоит хранить в отдельном поле, и дать ему атрибут игнорирования, а сериализировать поле с типов 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); }
      }

    • @ivannarykin
      @ivannarykin 4 роки тому

      @@egolds И снова огромное спасибо. Цель достигнута. Не получилось только заменить название поля, так как я это поле использовал как атрибут: . Но, я вышел из положения просто назвав стринговую переменную "date". :)
      И не совсем понятно что делает эта строка: set { hiddenFieldDateTime = DateTime.Parse(value); }
      Супер. Спасибо. Я ваш должник! ;)

    • @egolds
      @egolds  4 роки тому +1

      Пожалуйста) В данном случае поле 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

    • @ivannarykin
      @ivannarykin 4 роки тому +1

      @@egolds Ясно! Еще раз огромное спасибо! Ждём новых видео! ;)

  • @Собственник-т3к
    @Собственник-т3к 4 роки тому

    Это если файл существует в твоей папке, то можно десериализовать, а если в бд находится, в поле хмл ?

    • @egolds
      @egolds  4 роки тому

      Необходимо просто загрузить из поля бд в переменную как string и выполнить десериализацию.
      И в таком случае использовать FileStream не нужно, просто return (Users)xml.Deserialize(сюда переменная со строкой из базы);

    • @Собственник-т3к
      @Собственник-т3к 4 роки тому

      @@egolds спасибо

    • @egolds
      @egolds  4 роки тому

      @@Собственник-т3к пожалуйста)

  • @sergejsjermakovs9619
    @sergejsjermakovs9619 3 роки тому

    Целый int для хранение только даух чисел (1 или 0)???

    • @egolds
      @egolds  3 роки тому +1

      Да ладно, суть то не в этом)

    • @sergejsjermakovs9619
      @sergejsjermakovs9619 3 роки тому

      @@egolds Просто школота перепишет даже не задумываясь. А потом будут долго препаду обьеснять почему так ))

    • @poipoipoip
      @poipoipoip 3 роки тому

      @@sergejsjermakovs9619 по хорошему надо для этого отдельную структуру сделать

    • @poipoipoip
      @poipoipoip 3 роки тому

      или энам, кстати

  • @ivannarykin
    @ivannarykin 4 роки тому

    Уважаемый Egolds, после сериализации файл выглядит как нужно, а вот декларация отображает только версию: . Сегодня за вес день голову сломал над тем как отобразить еще и кодировку, но безрезультатно. Может вы подскажете?

    • @egolds
      @egolds  4 роки тому

      Да, знаю как сделать это, завтра постараюсь написать

    • @ivannarykin
      @ivannarykin 4 роки тому

      @@egolds Решил вопрос сериализуя данные через TextWriter. Там utf-8 по умолчанию используется и отображается. Спасибо!

  • @assahassahov3167
    @assahassahov3167 4 роки тому

    привет,помоги.. почему сериализуется только если много объектов в listview? а если один обект то записывает в файл просто как строку (стринг стринг...), почему может такое быть?

    • @egolds
      @egolds  4 роки тому

      А какие изменения ты делал в проекте который я дал? Потому что у меня записывает правильно, даже когда добавлен лишь один объект. Или ты делаешь сериализацию в своем проекте? Если так, тогда покажи, как ты выполняешь сериализацию? Какой тип данных используется при определении объекта класса XmlSerializer?

    • @assahassahov3167
      @assahassahov3167 4 роки тому

      @@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 пишет и десериализует тоже нормально

    • @egolds
      @egolds  4 роки тому

      Окей, а каким изменениям подвергся класс User?

    • @assahassahov3167
      @assahassahov3167 4 роки тому

      @@egolds никаким

    • @egolds
      @egolds  4 роки тому

      Это ты в WPF делаешь?
      Загрузи проект на github и дай мне ссылку, я исправлю

  • @АндрійГуцалюк-м5д
    @АндрійГуцалюк-м5д 2 роки тому

    Не секс- а Гендер ))))

  • @helmas_witch
    @helmas_witch 3 роки тому +2

    ты куда так гонишь? ниче не обьясняешь! для кого снял? для себя что ли?

    • @egolds
      @egolds  2 роки тому

      Это я экспериментировал, хотел сделать чтобы не так скучно было

    • @helmas_witch
      @helmas_witch 2 роки тому +1

      @@egolds я думала, что попала на обучающее, а не на развлекательное видео

    • @egolds
      @egolds  2 роки тому

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

    • @helmas_witch
      @helmas_witch 2 роки тому

      @@egolds будет здорово, продолжай развиваться и все у тебя получится

    • @egolds
      @egolds  2 роки тому

      Приятно, спасибо)