如何有效地使用DataContractSerializer这个用例?

时间:2011-01-25 04:10:28

标签: c# silverlight windows-phone-7

我想使用功能强大的DataContractSerializer将数据写入或读取到XML文件。

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

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

我有一个名为“Information”的结构,并且在此列表中有一个List<Information>具有可预见数量的元素。

用户可以经常更新或添加新元素到这个列表中。

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

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

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

我害怕表现,可能会让UI滞后......

DataContractSerializer可以使用任何解决方法将数据信息部分更新或添加到XML文件中吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果需要考虑性能,那么使用DataContractSerializer以外的其他东西。

对选项进行了很好的比较 http://blogs.claritycon.com/kevinmarshall/2010/11/03/wp7-serialization-comparison/

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

根据更改数据的频率,您可以尝试在更改时保存数据。这样就无需在可用于停用的时间内保存它。