阵列序列化性能问题

时间:2010-10-01 10:17:54

标签: .net arrays serialization compact-framework

在我的Windows Mobile(.NET Compact Framework)应用程序中,我使用一个大数组来存储应用程序的主数据。这是可能有数百个对象的数据集。每个对象有大约10个左右的属性和两个自身的数组,每个对象有大约25个其他对象,每个对象有大约5个属性。

要将此阵列保存在移动设备上,我只需序列化整个阵列。这在大多数情况下运作良好,而且非常非常容易。

然而,在我们的测试案例中,我们总是只处理少数几个对象,最多约50到75个。但是我们的客户端已经遇到过用户拥有数百个这些对象的情况,最多可达1000个。在这些情况下,序列化很慢,可能需要一分钟。

实际问题是在保存整个阵列时,实际上只有几个对象实际发生了变化。所以基本流程是这样的:

  • 从存储装载整个阵列,比如400个对象;
  • 更改1个对象的一些属性;
  • 将整个阵列保存回存储,完整的400个对象;
  • 更改同一个对象的更多属性;
  • 再次保存
  • 更改最终属性;
  • 再次保存;
  • 与任何后续对象相同......

如果不经常进行保存,那么通常不会出现问题,但是在保存数据的几个中间步骤中。这是为了确保所有数据都保持不变并且不会发生数据丢失(例如,当电池耗尽时)。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

所以要明确,请确保我理解你的情景:

  • 您所拥有的是某种形式的序列化数组(您没有将格式称为XML,二进制或其他形式)作为您的数据存储?
  • 如果一个属性发生变化,即使有1000个带有子对象的对象,也会重写整个数组?
  • 你写的是Flash,而不仅仅是RAM?
  • 对于一个完整的“保存”你几次写入操作?
  • 由于某种原因,你发现这很慢,而且数据集越大,它就越慢?

答案其实很简单。根据您的操作方式,这是完全预期的行为。为什么要将此机制用于数据存储,尤其是对于大型,频繁更改的项目?这是一个糟糕的设计决策的典型例子。当属性发生变化时,您应该仅更改存储中的该属性,并且序列化数组不太适合这种情况。

你应该使用一个真正的数据库引擎,无论是RDBMS还是对象数据库,还有一些正在做的事情,而不是写入存储介质。如果您需要将数据作为数组传输到PC / Server,那很好 - 创建一个从商店中提取并将其放入数组的机制。