【问题标题】:How to optimize suspend time with XmlSerializer?如何使用 XmlSerializer 优化挂起时间?
【发布时间】:2012-10-06 07:27:38
【问题描述】:

我想将新闻应用提交到 Windows 应用商店,但它总是无法通过应用认证过程(提交前的本地检查),因为我在应用挂起时使用 XmlSerializer 将数据序列化为 XML 文件(OnSuspended-Event )。当我不序列化时,应用程序成功通过了此认证过程...

documentation 建议如下:

当你序列化你的数据时,你应该避免重新序列化 没有改变。序列化和保存数据需要额外的时间, 加上激活应用程序时读取和反序列化它的额外时间 再次。相反,我们建议应用确定其状态是否 实际改变了,如果是这样,只序列化和反序列化数据 改变了

我真的很喜欢这个想法,但不幸的是不知道如何实现它。我有一个包含新闻项目的集合(在应用程序启动时下载),用户下载这些新闻项目的详细信息。所以,基本上在暂停时,我只应该序列化这些细节,并且可以在初始加载后序列化新闻项目。我怎样才能做到这一点?

感谢您的帮助!

【问题讨论】:

  • 我猜操作系统会检测到您写入的文件与以前的内容完全相同。您可以通过每次序列化 Guid.NewGuid() 来解决此问题。
  • @usr。非常感谢您的宝贵意见。这是一个很好的观点:我现在添加了一个全局变量,我检查它是否发生了变化。有了这个,我终于可以通过认证要求流程了。 - 有人知道如何仅序列化更改的项目而不是所有内容吗? - 谢谢。
  • 没有内置这样的功能。实现这一点需要做很多工作。如果你只序列化几个 KB,我真的不会打扰它(因为它没有区别),只需添加一个随机值来作弊通过要求。
  • @usr: 那么如果它大约是 400 KB 并且可以轻松增长到 1 MB? - 无论如何,序列化确实很快,但我不希望应用程序的这一部分出现任何麻烦......目前,我只在有变化时进行序列化。否则我序列化任何东西都没有意义,因为我已经这样做了......谢谢

标签: c# serialization windows-8 microsoft-metro xmlserializer


【解决方案1】:

简单的只读数据:

  1. 如果缓存文件存在,则在应用加载时将其反序列化为内存对象。
  2. 根据用户请求,从服务中获取更新、合并结果并立即序列化所有内容。
  3. 在挂起时,无事可做。更新发生后,您的数据已保留。

如果用户进行一些更改会怎样:

  1. 如果缓存文件存在,则在应用加载时将其反序列化为内存对象。
  2. 在用户编辑时,更新到/从服务,合并结果并立即序列化所有内容。
  3. 在挂起时,无事可做。更新发生后,您的数据已保留。

这里真正的收获是,在暂停时您应该无事可做或几乎无事可做。暂停事件旨在让您的应用有时间保存其状态。它不打算保存其数据。这是因为最轻微的打嗝可能会导致您的保存过程失败,并且因为您只有几秒钟(毫不留情)您的数据会丢失并且您的应用程序看起来很糟糕。

由于应用切换速度快,内存中已有的缓存不会改变。由于您明确监控服务的更新或用户的更改,因此您没有理由“确定”内存中的内容与缓存文件中的内容之间是否存在差异。

另一个建议,如果它很大,不要将整个对象序列化为单个文件。出于性能原因,你没有理由不能打破你的类并单独列出和序列化它们。老实说,这很常见。

【讨论】:

  • 精彩的解释。这正是我要做的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多