.NET 4.x Автоматическая сериализация кллекции XmlSerializer.Serialize(); - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Помогите пожалуйста разобраться с XML сериализацией. Делаю телефонный справочник. Есть класс Person, у которого есть свойства: Name, Phone, Address, Email, Birthday. который хранит все данные в коллекции List<Person> Необходимо, чтобы при добавлении нового контакта, данные записывались в XML файл. Для этого нужно использовать XmlSerializer.Serialize(); которому, как я понимаю, я должен подсунуть объект типа Person и структуру XML в виде XSD файла. XSD я читал, можно сделать при помощи утилиты xsd.exe но с уже готового XML!? Которого у меня пока нет. Код ниже. Спасибо.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
 
namespace PhoneBook {
  public partial class Form1 : Form {
    List<Person> people = new List<Person>();
 
    public Form1() {
      InitializeComponent();
      listView1.View = View.List;
    }

    private void Form1_Load(object sender, EventArgs e) {
 
      string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
      // Read from XML file when App is Opened
      if (!File.Exists(path + "\\PhoneBook\\settings.xml"))
        return;
 
      XmlDocument xDoc = new XmlDocument();
      try {
        xDoc.Load(path + "\\PhoneBook\\settings.xml");
        foreach (XmlNode xNode in xDoc.SelectNodes("People/Person")) { //Select the node inside xml
          Person p = new Person();
          p.Name = xNode.Attributes["Name"].InnerText;
          p.Phone = xNode.Attributes["Phone"].InnerText;
          p.StreetAddress = xNode.Attributes["StreetAddress"].InnerText;
          p.Email = xNode.Attributes["Email"].InnerText;
          p.Birthday = DateTime.FromFileTime(Convert.ToInt64(xNode.Attributes["Birthday"].InnerText));
          people.Add(p);
        }
      }
      catch {
        return;
      }
      UpdateListView(people);
    }
 
    protected override void OnClosed(EventArgs e) {
 
      string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
 
      if (!Directory.Exists(path + "\\PhoneBook"))
        Directory.CreateDirectory(path + "\\PhoneBook");
      if (!File.Exists(path + "\\PhoneBook\\settings.xml"))
        File.Create("\\PhoneBook\\settings.xml");
 
      XmlTextWriter xw = new XmlTextWriter(path + "\\PhoneBook\\settings.xml", Encoding.UTF8);
      xw.WriteStartElement("People");
      foreach (Person item in people) {
        XmlSerializer xx = new XmlSerializer(typeof(Person));
        xx.Serialize(xw, item);
 
        //xw.WriteStartElement("Person");
        //xw.WriteAttributeString("Name", item.Name);
        //xw.WriteAttributeString("Phone", item.Phone);
        //xw.WriteAttributeString("StreetAddress", item.StreetAddress);
        //xw.WriteAttributeString("Email", item.Email);
        //xw.WriteAttributeString("Birthday", item.Birthday.ToFileTime().ToString());
        //xw.WriteEndElement();
      }
      xw.WriteEndElement();
      xw.Close();
 
      base.OnClosed(e);
    }
 
    private void button2_Click(object sender, EventArgs e) {
 
      Person p = new Person();
      p.Name = textBox1.Text;
      p.Phone = textBox2.Text;
      p.StreetAddress = textBox3.Text;
      p.Email = textBox4.Text;
      p.Birthday = dateTimePicker1.Value;
      people.Add(p);                     //adding created person to the List<>
 
      textBox1.Text = String.Empty;
      textBox2.Text = String.Empty;
      textBox3.Text = String.Empty;
      textBox4.Text = String.Empty;
      dateTimePicker1.Value = DateTime.Now;
 
      UpdateListView(people);
    }
 
    private void listView1_SelectedIndexChanged(object sender, EventArgs e) {
 
      if (listView1.SelectedItems.Count == 0) {
        textBox1.Text =
        textBox2.Text =
        textBox3.Text =
        textBox4.Text = string.Empty;
      }
      else {
        textBox1.Text = people[listView1.SelectedItems[0].Index].Name;
        textBox2.Text = people[listView1.SelectedItems[0].Index].Phone;
        textBox3.Text = people[listView1.SelectedItems[0].Index].StreetAddress;
        textBox4.Text = people[listView1.SelectedItems[0].Index].Email;
        dateTimePicker1.Value = people[listView1.SelectedItems[0].Index].Birthday;
      }
    }
 
    private void button3_Click(object sender, EventArgs e) {
      Remove();
    }
 
    private void UpdateListView(List<Person> list) {
 
      listView1.Items.Clear();
      foreach (var item in list)
        listView1.Items.Add(item.ToString());
    }
 
    void Remove()  //Method deletes items from the ListView
    {
      try {
        listView1.Items.Remove(listView1.SelectedItems[0]);
        people.RemoveAt(listView1.SelectedItems[0].Index);
      }
      catch {
      }
 
    }
 
    private void removeToolStripMenuItem_Click(object sender, EventArgs e)  //Context menu Remove (doesn't work)
    {
      Remove();
    }
 
    private void button1_Click(object sender, EventArgs e)  //Save Changes
    {
      people[listView1.SelectedItems[0].Index].Name = textBox1.Text;
      people[listView1.SelectedItems[0].Index].Phone = textBox2.Text;
      people[listView1.SelectedItems[0].Index].StreetAddress = textBox3.Text;
      people[listView1.SelectedItems[0].Index].Email = textBox4.Text;
      people[listView1.SelectedItems[0].Index].Birthday = dateTimePicker1.Value;
      listView1.SelectedItems[0].Text = textBox1.Text; // Change name in the ListView
    }
    /*
    private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
 
      XmlDocument xDoc = new XmlDocument();
      string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
      xDoc.Load(path + "\\PhoneBook\\settings.xml");
 
      XmlNode xNode = xDoc.SelectSingleNode("People");  // Deleting from Xml to avoid copying records
      xNode.RemoveAll();
      foreach (Person p in people) {
        XmlNode xTop = xDoc.CreateElement("Person");
        XmlNode xName = xDoc.CreateElement("Name");
        XmlNode xPhone = xDoc.CreateElement("Phone");
        XmlNode xStreetAddress = xDoc.CreateElement("StreetAddress");
        XmlNode xEmail = xDoc.CreateElement("Email");
        XmlNode xBirthday = xDoc.CreateElement("Birthday");
        xName.InnerText = p.Name;
        xPhone.InnerText = p.Phone;
        xStreetAddress.InnerText = p.StreetAddress;
        xEmail.InnerText = p.Email;
        xBirthday.InnerText = p.Birthday.ToFileTime().ToString();
        xTop.AppendChild(xName);
        xTop.AppendChild(xPhone);
        xTop.AppendChild(xStreetAddress);
        xTop.AppendChild(xEmail);
        xTop.AppendChild(xBirthday);
        xDoc.DocumentElement.AppendChild(xTop);
      }
      xDoc.Save(path + "\\PhoneBook\\settings.xml");
    }*/
  }

  }

Решение задачи: «.NET 4.x Автоматическая сериализация кллекции XmlSerializer.Serialize();»

textual
Листинг программы
 var xx = new XmlSerializer(typeof(List<Person));
            using (var stream = File.Create(path + "\\PhoneBook\\settings.xml"))
            {
                xx.Serialize(stream, people);
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5