3

我对 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>

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

4

5 回答 5

1

在 XML 文件中到处更改属性是相当困难的,无论它们发生了什么变化。您应该将整个文件读入内存,然后在保存时写出整个文件,覆盖旧文件。

XML 并不是一种糟糕的方法,但据我从问题中可以看出,SQL Server(或其他 RDBMS)数据库会更合适。你不必担心这样的问题,因为数据库引擎会为你做这件事。

于 2012-05-24T13:00:16.637 回答
0

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

<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>

现在您可以使用 XPath 来选择那些需要更新并更改其内容的节点。

  1. 将文档加载到 XDocument
  2. 找车:document.Element("Car[id=2]")
  3. 设置新值: element.Element("Color").Value = "Black"

但是,使用基于文件的存储的缺点仍然存在。您仍然需要将整个文件加载到内存中并将其写回硬盘驱动器,但您不必序列化所有 Car 对象。我想不出一种简单的方法来从硬盘驱动器流式传输文件并一次性操作它。

于 2012-05-24T13:22:02.843 回答
0

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

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

于 2012-05-24T12:56:59.750 回答
0

你不能用 XML 做到这一点。考虑使用关系数据库。关系数据库具有内置的文件空间管理机制,可以完全按照您的需要进行操作。您可以更新单个记录、添加和删除记录。

Jet .mdb 数据库 (Access) 是替换 XML 文件的理想选择。您可以通过 OLEDB 访问它,但应用程序必须编译为 32 位。无需安装 Access。

于 2012-05-24T12:58:23.353 回答
0

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

于 2012-05-24T12:54:32.343 回答