Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XML持久化:多个文件还是单个文件?_C#_Xml - Fatal编程技术网

C# 使用XML持久化:多个文件还是单个文件?

C# 使用XML持久化:多个文件还是单个文件?,c#,xml,C#,Xml,我已经了解了有关的一般指导原则 我决定在幕后使用XML。这是一个小应用程序,一个供教师使用的成绩单应用程序。这些是我的主要实体: 学生 课程 教师(应该只有一个,但我会存储它,因为将来可能会集成) 等级(学生在每门课程中可以有多个等级) 我有几点想提出建议: 在幕后,每个实体应该有一个XML文件还是一个大的XML文件? 从性能的角度来看,这是怎么回事 从数据连接的角度来看,这是怎么回事 在幕后,我应该使用Linq到XML吗?还有什么可以考虑的吗 一个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仅保存部分数据。