如何序列化对象列表

时间:2013-03-18 19:04:19

标签: c# xml serialization

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace AppPrueba
{
    public partial class Form1 : Form
    {
        ArrayList listaFilas = new ArrayList();
        public Form1()
        {
            InitializeComponent();
        }

        List<Empleados> emp = new List<Empleados>();
        List<Agenda> agen = new List<Agenda>();

        static public void SerializeToXML(List<Agenda> agen)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Agenda>));
            TextWriter textWriter = new StreamWriter(@"C:\agenda.xml");
            serializer.Serialize(textWriter, agen);
            textWriter.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog(this);
            string strfilename = openFileDialog1.FileName;

            txtPath.Text = strfilename;

            if ((strfilename.Trim().Length > 0) && (File.Exists(strfilename)))
            {
                string[] readText = File.ReadAllLines(strfilename);

                if (strfilename.EndsWith("Agenda.txt"))
                {
                    lstLinesBeforeChange.Items.Clear();
                    foreach (string s in readText)
                    {
                        lstLinesBeforeChange.Items.Add(s);
                    }
                }
                else
                {
                    lstLinesBeforeChange.Items.Clear();
                    foreach (string s in readText)
                    {
                        lstLinesBeforeChange.Items.Add(s);
                    }
                }
            }
        }

        private void btnModify_Click(object sender, EventArgs e)
        {
            string strfilename = txtPath.Text;

            string[] readText = File.ReadAllLines(strfilename);

            if (strfilename.EndsWith("Agenda.txt"))
            {
                lstLinesAfterChange.Items.Clear();

                foreach (string s in readText)
                {
                    int nroEmp = Convert.ToInt32(s.Substring(0, 4));
                    string nombre = s.Substring(4, 15);
                    string telef = s.Substring(19, 10);
                    string ciudad = s.Substring(29);

                    Agenda unAgenda = new Agenda();

                    unAgenda.NroEmp = nroEmp;
                    unAgenda.Nombre = nombre.TrimStart().TrimEnd();
                    unAgenda.Telefono = telef;
                    unAgenda.Localidad = ciudad;

                    agen.Add(unAgenda);

                    agen.Sort(delegate(Agenda a1, Agenda a2)
                    {
                        return a1.NroEmp.CompareTo(a2.NroEmp);
                    });
                }

                foreach (Agenda a in agen)
                {
                    string agenOrd = a.NroEmp.ToString() + "\t" + a.Nombre + "\t" + a.Telefono + "\t" + a.Localidad;

                    lstLinesAfterChange.Items.Add(agenOrd);
                }
            }
            else
            {
                lstLinesAfterChange.Items.Clear();
                foreach (string s in readText)
                {
                    string[] sSinBarra = s.Split('|');

                    int nroEmp = Convert.ToInt32(sSinBarra[0]);
                    string nombre = sSinBarra[1];
                    string posicion = sSinBarra[2];
                    int nroOficina = Convert.ToInt32(sSinBarra[3]);
                    int piso = Convert.ToInt32(sSinBarra[4]);
                    string fechaIng = sSinBarra[5];

                    int dia = Convert.ToInt32(fechaIng.Substring(0, 2));
                    int mes = Convert.ToInt32(fechaIng.Substring(2, 2));
                    int año = Convert.ToInt32(fechaIng.Substring(4, 4));
                    string fechaIngreso = dia + "/" + mes + "/" + año;
                    fechaIng = fechaIngreso;

                    Empleados unEmpleado = new Empleados();

                    unEmpleado.NroEmpleado1 = nroEmp;
                    unEmpleado.Nombre1 = nombre.TrimEnd().TrimStart();
                    unEmpleado.Posicion = posicion.TrimEnd().TrimStart();
                    unEmpleado.NroOficina = nroOficina;
                    unEmpleado.Piso = piso;
                    unEmpleado.FechaIngreso = fechaIngreso;

                    emp.Add(unEmpleado);

                    emp.Sort(delegate(Empleados e1, Empleados e2)
                    {
                        return e1.NroEmpleado1.CompareTo(e2.NroEmpleado1);
                    });
                }

                foreach (Empleados em in emp)
                {
                    string empOrd = em.NroEmpleado1.ToString() + "\t" + em.Nombre1 + "\t" + em.Posicion + "\t" + em.NroOficina.ToString()
                        + "\t" + em.Piso.ToString() + "\t" + em.FechaIngreso;

                    lstLinesAfterChange.Items.Add(empOrd);
                }
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            //SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            //saveFileDialog1.ShowDialog();

            //if (saveFileDialog1.FileName != "")
            //{
            //    FileStream fs = (FileStream)saveFileDialog1.OpenFile();

            //    fs.Close();

            //}
            SerializeToXML(agen);

        }
    }
}

我有这个,我想将两个列表序列化为xml:

List<Empleados> emp = new List<Empleados>();
List<Agenda> agen = new List<Agenda>();

我使用了在其他教程中找到的SerializeToXML方法,但是当我运行它时出现错误

  

“错误1可访问性不一致:参数类型   'System.Collections.Generic.List'不太容易访问   比方法   'AppPrueba.Form1.SerializeToXML(System.Collections.Generic.List)'C:\ Users \ 722825 \ Desktop \ Santi   Cosas \ AppPrueba \ AppPrueba \ Form1.cs 27 28 AppPrueba“

如果你能帮助我,请提前致谢!

3 个答案:

答案 0 :(得分:2)

您尝试序列化为xml的所有类都应该是公共的。对于集合序列化,您不能使用泛型 - 使用无类型集合,如ArrayList,或创建非泛型后代类表单。

答案 1 :(得分:0)

agen是私有的,SerializeToXML是公共静态的。您需要agen公开

答案 2 :(得分:0)

你的错误说变量List agen = new List();需要像这样公开:public列出agen = new List();