c# - 将 xml 反序列化为对象
问题描述
我正在开发一个程序,我需要将对象附加到 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);
}
请帮我
解决方案
下面的代码适用于多个人。关于使用 xml 的多个项目,您需要了解的两件事
1) 元素数组是 xml 的根,被认为是“Not Well Formed Xml”。xml 规范允许数组,但 Net 库默认不允许这些数组,除非您使用 XmlWriter 选项:
XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlWriter writer = XmlWriter.Create(FILENAME, settings);
2) 带有数组的 Xml 序列化程序创建两个标签 1) Persons 2) Person。请参阅下面的代码输出以查看这些元素。
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; }
}
}
推荐阅读
- android - 即使有 Flex 父级,Flutter Expanded 小部件也会出错
- r - 终止涉及根函数和事件函数的 ODE 求解器
- python - 如何使用 Python 从 CGI 网页读取数据?
- php - PHP回显变量在while循环之外返回最后一个值
- google-apps-script - 有没有办法使用 Google 表格/Google Apps 脚本将条件格式转换为“静态”格式?
- python - 如何循环遍历多个数据框以根据行条件选择数据框?
- python - 为什么干净的 Midi 文件播放不同?(与米多)
- kubernetes-helm - Helm Charts - 如何在未定义的对象属性值上使用“默认”?
- java - 如何在大文本文件的开头插入文本?
- arrays - Swift 类型变量到泛型类型变量