2011-01-25 56 views
0

我想使用强大的DataContractSerializer将数据写入或读取到XML文件。如何在此用例中有效地使用DataContractSerializer?

但作为我的概念,DataContractSerializer只能读取或写入整个结构或结构列表的数据。

我的用例描述如下....我无法弄清楚如何使用此API来优化性能。

我有一个名为“信息”的结构,并有一个List<Information>与此列表中的元素意外数量。

用户可能经常更新或添加新元素到此列表中。

根据操作(添加或更新),我必须将列表中的所有元素序列化为同一个XML文件。

因此,即使它们没有再次修改为XML,我也会写入相同的数据。这没有意义,但我找不到任何方法来避免发生这种情况。

由于墓碑机制,我必须在10秒内保存所有信息。

我怕性能,并可能使得UI滞后......

我可以使用任何变通方法来部分地更新或添加数据信息转换DataContractSerializer的XML文件?

回答

0

DataContractSerializer可用于序列化选定的项目 - 您需要做的是提出方案来识别更改的数据以及有效地序列化它的方法。例如,其中一种方式可能是

  1. 您可以将整个结构列表序列化为文件。
  2. 每当某个对象被添加/更新/从列表中移除时,您将创建一个diff对象,该对象将识别更改类型和对象更改。然后,您可以将此对象序列化为xml并将xml附加到文件。
  3. 读取文件时,您可能必须应用类似的逻辑,首先阅读列表,然后开始逐个应用差异。
  4. 因为你想连续追加到文件中,所以你的文件中不应该有根元素。换句话说,带有diff信息的文件不会是有效的xml文档。它将包含一系列xml片段。要阅读它,你必须将这些片段放在一个xml声明和根元素中。
  5. 您可能会使用一些后台任务来定期写入整个列表以生成有效的xml文件。此时,您可能会放弃您的差异文件。想法是模仿交易系统 - 一个数据结构具有序列化/保存的信息,然后是另一个包含变化的结构(类似于事务日志)。
0

如果性能是一个问题,那么使用除DataContractSerializer之外的其他方法。

有选项在 http://blogs.claritycon.com/kevinmarshall/2010/11/03/wp7-serialization-comparison/

比较不错。如果列表的大小是一个问题,你可以尝试分解成较小的列表。最合适的做法取决于列表中的数据和典型的使用/编辑/添加模式。

根据数据更改的频率,您可以尝试每当更改时保存它。这将消除将其保存在可用于停用的时间的需要。