.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);
}