#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? Если это так, то посмотрите на метод, который вы используете для отображения списка (возможно, включите это в свой вопрос).