десериализовать xml до объекта - PullRequest
0 голосов
/ 23 января 2020

Я работаю над программой, в которой мне нужно добавить объекты в файл 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);
        }

, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 24 января 2020

Код ниже работает с более чем одним человеком. Две вещи, которые вы должны знать о множественных элементах с xml

1) Массив элементов с root из xml считается "Не правильно сформирован Xml". Спецификация xml разрешает массив, но библиотека Net по умолчанию не допускает этот массив, если только с XmlWriter не используется опция:

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

2) Xml сериализатор с массивом создает два тега 1) Человек 2) человек. Посмотрите выходные данные кода ниже, чтобы увидеть эти элементы.

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

}
...