【发布时间】:2022-01-02 01:23:36
【问题描述】:
我正在尝试将 csv 文件反序列化为列表。 如果有更好的方法将我的班级数据发送到文件中,然后将其重新组合到列表中,请告诉我。
班级:
[Serializable]
public class Student
{
int studentID;
string studentName;
string studentAge;
}
名单:
List<Student> students = new List<Student>();
students.studentID = txt_sID.Text;
students.studentName = txt_sName.Text;
students.studentAge = txt_sAge.Text;
序列化器:
XmlSerializer SerializerObj = new XmlSerializer(typeof(Student));
TextWriter WriteFileStream = new StreamWriter(@"students.csv", true);
SerializerObj.Serialize(WriteFileStream, students);
WriteFileStream.Close();
反序列化器:
XmlSerializer serializer = new XmlSerializer(typeof(Student));
using (Stream reader = new FileStream(@"students.csv", FileMode.Open))
{
Student students2 = (Student)serializer.Deserialize(reader);
students.Add(students2);
}
错误:
XmlException: Unexpected XML declaration. The XML declaration must be the first node in the document, and no whitespace characters are allowed to appear before it.
CSV 文件内容:
<?xml version="1.0" encoding="utf-8"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<studentID>1</studentID>
<studentName>Jonathan Joestar</studentName>
<studentAge>21</studentAge>
</Student><?xml version="1.0" encoding="utf-8"?>
我尝试过的:
- 使用 XmlWriter.Create 作为序列化程序来摆脱 Xml 标记。 csv 文件必须接受多个条目并放回列表中,而 XmlWriter.Create 一次只能处理一个条目 (?)。
诚挚的问候并感谢您的宝贵时间。
【问题讨论】:
-
为什么要混淆 CSV 和 XML?这些是完全不同的数据序列化方式。 Xml 是更通用,但也更冗长的方式。
-
老实说,我不知道。我正在尝试学习将数据放入列表并返回,这是向我建议的
-
作为 XML,您的文档格式不正确。它最后有一个额外的 XML 声明
<?xml version="1.0" encoding="utf-8"?>,不应该在那里。应该只有一个 XML 声明,并且应该出现在文档的开头。因此错误XmlException: Unexpected XML declaration.正确地解释了您的文档的问题。您也可以将您的 XML 上传到 xmlvalidation.com 以确认这是问题所在。要解决此问题,您应该修复生成格式错误的 XML 的代码。 -
最后你得到了
<?xml version="1.0" encoding="utf-8"?>,因为你正在使用附加文件的new StreamWriter(String, true)构造函数打开。