首页 > 解决方案 > 将 xml 反序列化为对象

问题描述

我正在开发一个程序,我需要将对象附加到 xml 文件并读取它写入文件没有问题我的问题是当读取对象时从 xml 文件中读取对象不止一个时我有错误

        public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
    {
        TextWriter writer = null;
        try
        {
            var serializer = new XmlSerializer(typeof(T));
            writer = new StreamWriter(filePath, append);
            serializer.Serialize(writer, objectToWrite);
        }
        finally
        {
            if (writer != null)
                writer.Close();
        }
    }


        public static T ReadFromXmlFile<T>(string filePath) where T : new()
    {
        TextReader reader = null;
        try
        {
            var serializer = new XmlSerializer(typeof(T));
            reader = new StreamReader(filePath);
            Console.WriteLine("file readed correctly");
            return (T)serializer.Deserialize(reader);
        }

        finally
        {
            if (reader != null)
                reader.Close();
        }
    }

和我的主要测试方法:Person 是一个简单的类,仅用于测试,包含 A、B、a、b 字段

    static void Main(string[] args)
    {

        Person p1 = new Person();
        p1.A = 1;
        p1.B = 2;
        Person p2 = new Person();
        p2.A = 45;
        p2.B = 65;
        Person p3 = new Person();
        p3.A = 213;
        p3.B = 34;
        Person p4 = new Person();
        p4.A = 45;
        p4.B = 234;
        Person p5 = new Person();
        p5.A = 324;
        p5.B = 123;
        Person p6 = new Person();
        p6.A = 53;
        p6.B = 53;
        Person p7 = new Person();
        p7.A = 46545;
        p7.B = 6435;
        Person p8 = new Person();
        p8.A = 4355;
        p8.B = 6435;
        Person p9 = new Person();
        p9.A = 4455;
        p9.B = 6455;
        Person p10 = new Person();
        p10.A = 4455;
        p10.B = 6345;



        Person[] per = new Person[] {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 };

        foreach (Person pppp in per)
        {
            FileIO.WriteToXmlFile<Person>("C://Users//ulduz//Desktop//ShoppingBackend//ShoppingBackend//personList.xml", pppp, true);
        }



        foreach (Person pppp in per)
        {
            Console.WriteLine(FileIO.ReadXML<Person>("C://Users//ulduz//Desktop//ShoppingBackend//ShoppingBackend//personList.xml").A);
        }

请帮我

标签: c#xmlxmlserializer

解决方案


下面的代码适用于多个人。关于使用 xml 的多个项目,您需要了解的两件事

1) 元素数组是 xml 的根,被认为是“Not Well Formed Xml”。xml 规范允许数组,但 Net 库默认不允许这些数组,除非您使用 XmlWriter 选项:

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            XmlWriter writer = XmlWriter.Create(FILENAME, settings);

2) 带有数组的 Xml 序列化程序创建两个标签 1) Persons 2) Person。请参阅下面的代码输出以查看这些元素。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Person p1 = new Person() { A = 1, B = 2};
            Person p2 = new Person() { A = 45, B = 65 };
            Person p3 = new Person() { A = 213, B = 34 };
            Person p4 = new Person() { A = 45, B = 234 };
            Person p5 = new Person() { A = 324, B = 123 };
            Person p6 = new Person() { A = 53, B = 53 };
            Person p7 = new Person() { A = 46545, B = 6435 };
            Person p8 = new Person() { A = 4355, B = 6435 };
            Person p9 = new Person() { A = 4455, B = 6455 };
            Person p10 = new Person() { A = 4455, B = 6345 };

            List<Person> people = new List<Person>() { p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 };

            WriteToXmlFile(FILENAME, people);

        }
        public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
        {
            TextWriter writer = null;
            try
            {
                var serializer = new XmlSerializer(typeof(T));
                writer = new StreamWriter(filePath, append);
                serializer.Serialize(writer, objectToWrite);
            }
            finally
            {
                if (writer != null)
                    writer.Close();
            }
        }


        public static T ReadFromXmlFile<T>(string filePath) where T : new()
        {
            TextReader reader = null;
            try
            {
                var serializer = new XmlSerializer(typeof(T));
                reader = new StreamReader(filePath);
                Console.WriteLine("file readed correctly");
                return (T)serializer.Deserialize(reader);
            }

            finally
            {
                if (reader != null)
                    reader.Close();
            }
        }
    }
    public class Person
    {
        public int A { get; set; }
        public int B { get; set; }
    }

}

推荐阅读