我在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文件并保存它,以便下次我的代码启动时获取最新的状态信息。
答案 0 :(得分:1)
在这里和那里改变属性的XML文件,无论它们在哪里发生变化,都很难跳转。你应该把整个文件读入内存,当你保存时,写出整个文件,覆盖旧文件。
XML并不是一种可怕的方法,但就我所知,SQL Server(或其他RDBMS)数据库会更合适。你不必担心这样的问题,因为数据库引擎会为你做这件事。
答案 1 :(得分:0)
虽然它可能不是最佳解决方案,但可能可行的选择是将已编辑的列表序列化为单独的文件,并在代码中比较这两个文件。如果信息没有任何变化,则两个文本文件应该相同。如果没有,您可以用新文件替换旧文件。最简单的方法是,而不是序列化到文件并读/写它,也许将它发送到流并进行比较。
答案 2 :(得分:0)
序列化对象时,它会生成整个XML文档。因此,如果将其保存到文件中,它将覆盖文件的先前内容。因此,如果您希望生成的文件包含所有汽车,包括但不限于修改过的汽车,那么您需要序列化整个汽车。如果您只序列化了那些已更改的文件,那么该文件将丢失所有未更改的汽车。如果您真的只想序列化已更改的汽车,我建议您创建一个AutoExpo对象的新实例,并仅将要保存的汽车插入其中,然后仅使用部分列表序列化该对象。
如果您只需要修改XML中的单个元素而不触及其余元素,因为数据太大,XML就不是一个好选择。我会建议使用关系数据库。或者,您可以将每辆汽车存储为自己的XML文件,并且只在必要时单独加载和保存每个汽车。
答案 3 :(得分:0)
你不能用XML做到这一点。考虑使用关系数据库。关系数据库具有内置的文件空间管理机制,可以完全满足您的需求。您可以更新单个记录,添加和删除记录。
Jet .mdb数据库(Access)是替换XML文件的理想选择。您可以通过OLEDB访问它,但必须将应用程序编译为32位。无需安装访问权限。
答案 4 :(得分: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选择那些需要更新并更改其内容的节点。
但是,使用基于文件的存储的缺点仍然存在。您仍然必须将整个文件加载到内存中并在更新时将其写回硬盘驱动器,但您不必序列化所有Car对象。 我想不出一种简单的方法来从硬盘驱动器传输文件并一次操作它。