Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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 Serialization - Fatal编程技术网

C# 仅序列化xml文件的一部分并保存它

C# 仅序列化xml文件的一部分并保存它,c#,xml-serialization,C#,Xml Serialization,我在XML序列化方面有一个问题。我将尝试用下面的示例xml文件来解释它 <AutoExpo> <Details> <Venue>XYZ</Venue> <StartTime>09:00</StartTime> <EndTime>21:00</EndTime> </Details> <Cars> <Car>

我在XML序列化方面有一个问题。我将尝试用下面的示例xml文件来解释它

<AutoExpo>
  <Details>
    <Venue>XYZ</Venue>
    <StartTime>09:00</StartTime>
    <EndTime>21:00</EndTime>
  </Details>

  <Cars>
      <Car>
        <Company>Chevrolet</Company>
        <Model>Cruz</Model>
        <Color>Red</Color>
      </Car>

      <Car>
        <Company>Ford</Company>
        <Model>Fiesta</Model>
        <Color>Blue</Color>
      </Car>

  </Cars>
</AutoExpo>

XYZ
09:00
21:00
雪佛兰
克鲁兹
红色
河流浅水处
嘉年华
蓝色

现在,当我读取这个xml文件时,我将汽车反序列化为对象。汽车清单可能是巨大的。我的代码使用这些对象,可以更改某些汽车的属性。现在,如果我只想序列化那些属性已更改的car对象,返回到xml文件并保存它,以便下次代码启动时获得最新的状态信息,该怎么办

尽管这可能不是最好的解决方案,但一个可能可行的选择是将已编辑的列表序列化为一个单独的文件,并在代码中比较这两个文件。如果信息没有任何更改,则两个文本文件应相同。如果没有,可以用新文件替换旧文件。最简单的方法是,与其序列化为文件并读/写,不如将其发送到流并进行比较。

序列化对象时,它会生成整个XML文档。因此,如果将其保存到文件中,它将覆盖该文件以前的内容。因此,如果希望生成的文件包含所有汽车,包括但不限于修改后的汽车,则需要序列化整个文件。如果您只序列化更改的车辆,则该文件将丢失所有未更改的车辆。如果您确实只想序列化已更改的汽车,我建议您创建AutoExpo对象的新实例,并仅将要保存的汽车插入其中,然后仅使用部分列表序列化该对象


如果因为数据太大而只需要修改XML中的单个元素而不涉及其余元素,那么XML不是一个好的选择。我建议改为使用关系数据库。或者,您可以将每辆车存储为自己的XML文件,并根据需要单独加载和保存每辆车。

您不能使用XML来实现这一点。考虑使用关系数据库。关系数据库有一个内置的文件空间管理机制,允许您精确地执行所需的操作。您可以更新单个记录、添加和删除记录


mdb数据库(Access)是替换XML文件的一个很好的候选者。您可以通过OLEDB访问它,但应用程序必须编译为32位。Access不需要安装。

在XML文件中到处切换属性是相当困难的,无论它们在哪里更改。您应该将整个文件读入内存,保存时,写出整个内容,覆盖旧文件


XML并不是一种很糟糕的方法,但从这个问题中我可以看出,SQL Server(或其他RDBMS)数据库更合适。您不必担心这样的问题,因为DB引擎将为您解决这些问题。

首先,您的实体必须具有唯一的标识符

<AutoExpo>
  <Details>
    <Venue>XYZ</Venue>
    <StartTime>09:00</StartTime>
    <EndTime>21:00</EndTime>
  </Details>

  <Cars>
    <Car id="1">
      <Company>Chevrolet</Company>
      <Model>Cruz</Model>
      <Color>Red</Color>
    </Car>
    <Car id="2">
      <Company>Ford</Company>
      <Model>Fiesta</Model>
      <Color>Blue</Color>
    </Car>
  </Cars>
</AutoExpo>

XYZ
09:00
21:00
雪佛兰
克鲁兹
红色
河流浅水处
嘉年华
蓝色
现在,您可以使用XPath选择需要更新的节点并更改其内容

  • 将文档加载到XDocument中
  • 查找汽车:document.Element(“汽车[id=2]”)
  • 设置新值:element.element(“颜色”).value=“黑色”
  • 但是,使用基于文件的存储的缺点仍然存在。在向下更新时,您仍然必须将整个文件加载到内存中并将其写回硬盘,但不必序列化所有汽车对象。
    我想不出一个简单的方法来从硬盘上传输文件并一次操作它。

    另一个解决方案可能是将更改保存到一个文件中,然后不时创建快照。事实上,您必须解析多个文件(最新快照加上所有更改)才能“打开”数据库。PS:正如其他人所建议的,看一看关系数据库,或者看一个基于XML的数据库,它可能有助于迁移数据。