【发布时间】:2021-03-16 17:20:42
【问题描述】:
我有一个作为学校任务的 c# 应用程序,我必须能够使用序列化将数据保存到 xml。到目前为止,我能够保存一个类的实例,例如 Customer。但是当我输入新数据时,旧数据被覆盖,只有一个数据可用。有人可以看看我的代码并告诉我哪里错了吗?
serializationClass 这里是我序列化或反序列化我的 xml 的方法:
namespace Aufgabe_1
{
class serializerHelper
{
public void XmlSerialize(Type data, object objectData, string fileName)
{
using (var fileStream = new FileStream(fileName, FileMode.Append))
{
XmlSerializer xSerializer = new XmlSerializer(data);
xSerializer.Serialize(fileStream, objectData);
}
}
public object showData(Type dataType, string fileName)
{
object obj;
XmlSerializer xSerializer2 = new XmlSerializer(dataType);
TextReader textReader = new StreamReader(fileName);
obj = xSerializer2.Deserialize(textReader);
return obj;
}
}
我尝试将数据保存到 xml 的班级:
namespace Aufgabe_1
{
[Serializable]
public class Kunde
{
public string firstName;
public string lastName;
public string adress;
public string birthday;
public string bankDetails;
public Kunde() { }
public Kunde(string firstname, string lastname, string adress, string birthday, string bankdetails)
{
this.firstName = firstname;
this.lastName = lastname;
this.adress = adress;
this.birthday = birthday;
this.bankDetails = bankdetails;
}
public bool saveCustomer()
{
Console.Clear();
Console.WriteLine("Bitte geben sie den Namen des Kunden ein!");
string firstNameInput = Console.ReadLine();
Console.WriteLine("Bitte geben sie den Nachnamen des Kunden ein!");
string lastNameInput = Console.ReadLine();
Console.WriteLine("Bitte geben sie den Adresse des Kunden ein!");
string adressInput = Console.ReadLine();
Console.WriteLine("Bitte geben sie den Geburtsdatum des Kunden ein!");
string birthdayInput = Console.ReadLine();
Console.WriteLine("Bitte geben sie den Bankdetails des Kunden ein!");
string bankDetailsInput = Console.ReadLine();
Kunde customer = new Kunde(firstNameInput, lastNameInput, adressInput, birthdayInput, bankDetailsInput);
Console.Clear();
string filePath = "customerDatabase2.xml";
serializerHelper sHelper = new serializerHelper();
if (File.Exists("customerDatabase2.xml"))
{
kList = sHelper.showData(typeof(List<Kunde>), filePath) as List<Kunde>;
}
kList.Add(customer);
sHelper.XmlSerialize(typeof(List<Kunde>), kList, filePath);
Console.WriteLine("Ihr Kunde wurde gespeichert danke für die Zusammenarbeit!");
Console.Clear();
Console.WriteLine("Drücken Sie 1 um ins Hauptmenü zu gelangen und auf 2 um die Applikation zu beenden!");
Program p = new Program();
switch (Console.ReadLine())
{
case "1": Program.menuPoints(); return true;
case "2": Environment.Exit(0); return true;
}
return true;
}
public void showCustomers()
{
Console.Clear();
Console.WriteLine("Hier sind Ihre Kunden!");
string filePath = "customerDatabase.xml";
serializerHelper sHelper = new serializerHelper();
Kunde k;
k = sHelper.showData(typeof(Kunde),filePath) as Kunde;
Console.WriteLine("Vorname" + "Nachname" + "Adresse" + "Geburtsdatum" + "Bankdaten");
Console.WriteLine(k.firstName + k.lastName + k.adress + k.birthday + k.bankDetails);
}
}
}
我尝试使用 .Append 而不是 FileMode.Create,这样我可以保存 Kunde 类的多个实例,但随后我的 xml 中出现错误,无法再对其进行反序列化。
【问题讨论】:
-
你需要添加一个包含昆德语列表的根类。公共类 Root { public List
Kundes { get;set;}} -
我必须在我当前的班级内还是作为单独的班级这样做?我的意思是根类
-
一个单独的类。使用新类和改变类型:sHelper.showData(typeof(Kundes),filePath) as Kundes;