После сериализации сохраняется только последний клиент

#c# #console #xml-serialization

#c# #консоль #xml-сериализация

Вопрос:

Мне нужно создать консольное приложение, которое позволяет пользователю вводить (через терминал) сведения о новом пользователе. Затем это необходимо записать в XML с помощью сериализации (обязательно). Я создал свой класс customer и у меня есть метод для создания нового пользователя, но он всегда будет забывать последнюю запись и записывать только один экземпляр user в мой список.

Вот метод, который я создал для добавления пользователя:

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


namespace Hausarbeit_Autovermietung_Gierow
{
    class Addcustomer
    {
        public void AddCustomer()
        {
            
            var customer = new Customer();
            List<Customer> customers = new List<Customer>() { customer };
            //DeserializeFromXML(customer);
            DeserializeFromXML(customers);
            var listCount = customers.Count;

            int maxID = FindMaxValue(customers, x => x.ID);

            Console.WriteLine("Vorname eingeben");
            customer.Firstname = Console.ReadLine();
            Console.WriteLine("Nachname eingeben");
            customer.Lastname = Console.ReadLine();
           // int ID;
            customer.ID = maxID   1;
            
            //List<Customer> customers = new List<Customer>() { customer };

            SerializeToXML(customer);
            SerializeToXML(customers);
            
            foreach (var cust in customers)
            {
                Console.WriteLine($"Vorname: {cust.ID} {cust.Firstname} {cust.Lastname}");


                Console.ReadKey();

            }
            }

        static public void SerializeToXML(Customer customer)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Customer));
            using (TextWriter textWriter = new StreamWriter(@"customer.xml"))
            {
                serializer.Serialize(textWriter, customer);
            }
        }

        public static void SerializeToXML(List<Customer> customers)
        {
            //var customer = new Customer("Vorname", "Nachname");
            XmlSerializer serializer = new XmlSerializer(typeof(List<Customer>));
            using (System.IO.TextWriter textWriter = new System.IO.StreamWriter(@"List.xml"))
            {
                serializer.Serialize(textWriter, customers);
            }

        }

       static List<Customer> DeserializeFromXML(List<Customer> customers)
        {
            XmlSerializer deserializer = new XmlSerializer(typeof(List<Customer>));
            List<Customer> customerslist;
            using (TextReader textReader = new StreamReader(@"List.xml"))
            {
                customerslist = (List<Customer>)deserializer.Deserialize(textReader);
                return customerslist;
            }
        }

        public int FindMaxValue<T>(List<T> list, Converter<T, int> projection)
        {
            if (list.Count == 0)
            {
                throw new InvalidOperationException("Empty list");
            }
            int maxValue = int.MinValue;
            foreach (T item in list)
            {
                int value = projection(item);
                if (value > maxValue)
                {
                    maxValue = value;
                }
            }
            return maxValue;
        }
    }
}
 

Комментарии:

1. Вы не используете десериализованный список, возвращаемый DeserializeFromXML (и вы не используете его аргумент, просто удалите его). Я ожидаю, что вы десериализуете список, а затем добавите в него новый customer .

Ответ №1:

Здесь вы создаете список, содержащий только вашего нового клиента:

 List<Customer> customers = new List<Customer>() { customer };
 

Затем вы переопределяете его новым экземпляром путем десериализации xml:

 DeserializeFromXML(customers);
 

Но вы никогда не добавляете нового клиента (добавьте эту строку):

 customers.Add(customer);
 

Поэтому, когда вы сериализуете, новый клиент будет частью списка:

 SerializeToXML(customers);
 

Комментарии:

1. Привет, Стив, спасибо, что нашли время! Я внедрил клиентов. Add(customer); после предоставления всех значений без ошибок, но по-прежнему выдает только один элемент customer , wenn метод вызывается снова позже (во время выполнения).

2. Посмотрите в своем list.xml файл после выполнения этого. Правильно ли выглядит xml? Если это так, то посмотрите на метод, который вы используете для отображения списка (возможно, включите это в свой вопрос).