C# 使用XML持久化:多个文件还是单个文件?
我已经了解了有关的一般指导原则 我决定在幕后使用XML。这是一个小应用程序,一个供教师使用的成绩单应用程序。这些是我的主要实体:C# 使用XML持久化:多个文件还是单个文件?,c#,xml,C#,Xml,我已经了解了有关的一般指导原则 我决定在幕后使用XML。这是一个小应用程序,一个供教师使用的成绩单应用程序。这些是我的主要实体: 学生 课程 教师(应该只有一个,但我会存储它,因为将来可能会集成) 等级(学生在每门课程中可以有多个等级) 我有几点想提出建议: 在幕后,每个实体应该有一个XML文件还是一个大的XML文件? 从性能的角度来看,这是怎么回事 从数据连接的角度来看,这是怎么回事 在幕后,我应该使用Linq到XML吗?还有什么可以考虑的吗 一个XML文件可能更容易 该文件可能如下
- 学生
- 课程
- 教师(应该只有一个,但我会存储它,因为将来可能会集成)
- 等级(学生在每门课程中可以有多个等级)
- 在幕后,每个实体应该有一个XML文件还是一个大的XML文件?
- 从性能的角度来看,这是怎么回事
- 从数据连接的角度来看,这是怎么回事
- 在幕后,我应该使用Linq到XML吗?还有什么可以考虑的吗
一个XML文件可能更容易 该文件可能如下所示:
<ReportCardData>
<Students>
<Student>...data for student A ...</Student>
...
</Students>
<Teachers>
<Teacher> ...
...
</Teachers>
<Courses>
<Course> ...
...
</Courses>
</ReportCardData>
public class ReportCardData
{
public List<Student> Students;
public List<Teacher> Teachers;
public List<Course> Courses;
}
ReportCardData rcd = null;
var s= new System.Xml.Serialization.XmlSerializer(typeof(ReportCardData>));
using(System.IO.StreamReader reader= System.IO.File.OpenText(filepath))
{
rcd= (ReportCardData) s.Deserialize(reader);
}
…请确保添加适当的异常处理等
使用XML序列化可以很好地解决类似的问题,即使对于具有数十兆字节的大型数据集也是如此。(如果你谈论的是100兆字节的数据,那么可以考虑一个像SQL Express这样的真实数据库)
读写能力可能会很好。
请记住,当您从XML文件反序列化数据时,整个数据集将保存在应用程序的内存中。因此,如果它是15mb的等级数据,那么它一次全部存储在内存中
您还询问了“数据连接透视图”——不确定这意味着什么,但使用Linq to XML可以跨该数据执行查询。内存中查询的性能也很好 我想这是一个桌面而不是一个网络应用程序?是的,是的。目前,它是一个离线单机版。时间会证明,它可能会演变。所以我决定:这应该是一个尽可能简单的方法。甚至不用嵌入式数据库。它应该生成一个文件。XML是人类机器可读写的。所以这是显而易见的选择。文件不应该那么大。一位老师最多有100名学生。一名教师教授大约3至6门课程。我甚至在考虑把它建在手机上。但我想坚持C#,因为Linq会让我的生活更轻松。我只是想知道单x多文件的困境。我应该考虑什么?我没有考虑什么?如果坚持痛苦,另一个选择可能是使用“旧”数据表/数据集,让它们自动序列化。(我建议使用SQLite或类似的语言,因为关系/DQL非常好!)除非需要手工编辑或用作交换格式(例如在其他地方使用),否则XML不会“买”太多。实际上,使用XML作为带有XPath的非类型化数据对象是XML的另一个优点,但我认为有人会为此刺伤我;-)就数据大小做一个大概的数字,图25教师,每个教师都有1k的数据。400名学生,每人有2k的数据。75个课程,每个课程有5公里的数据。如果这是数据的规模,您所说的是~1mb。这对于XML序列化来说是一个合理的大小。。。所以,当文件加载时,我可以在内存中加载4组(比如,我将有4个列表)。然后用户可以到处玩。当用户点击Save时,所有内容都保存到XML中。这是一种情况。另一个是每次交互时保存(比如,如果是移动应用程序)。你认为第一种方法怎么样?第二,我如何最大限度地减少性能问题?我能最好地只保存XML文件的一小部分吗?我推荐第一种方法。一次加载并保存所有内容。您的4个列表都是一个类的一部分-一个被序列化和反序列化的嵌套对象。如果你真的关心绩效,你可以稍微改变一下。在一个移动应用程序中,我有一个非常大的XML数据库,我不想把它保留在内存中。我设计它来读取和索引XML文件。当用户需要深入了解或更新时,我会在XML文件中查找索引位置,并只读取并更新大型XML文件的一部分,仅读取和更新几个子元素。要知道什么适合您的案例,唯一的方法是对其进行原型化,并开始对其进行测试。例如,您可以结合我描述的方法,使用反序列化读取整个文件,但在更新时使用XmlWriter仅保存部分数据。