我有一个约有的.JSON文件。 1.5MB大小包含大约1500个JSON对象,我想在我的应用程序启动时将其转换为域对象。
目前我在手机上的程序(不在我的开发PC上)需要大约23秒,这对我来说太慢了,并且迫使我把对象列表写入ApplicationSettings
以便我不必这样做每次应用程序加载时(只是第一次关闭),但即使这需要15多秒的时间来写入,还有16秒的时间来读取,所有这些都不够好。
我没有很多序列化经验,我真的不知道完成它的最快方法。
目前,我正在使用System.Runtime.Serialization
命名空间DataContract
和DataMember
方法。
有关此类数据加载的性能方面的想法吗?
答案 0 :(得分:4)
我发现Json.NET库的性能更高,并且有更好的标准json序列化器选项。
我在我的应用中遇到的一个性能问题是我的域对象实现了INotifyPropertyChanged,其代码支持将事件调度回UI线程。由于反序列化代码填充了这些属性,我正在进行大量的线程编组,而不需要在那里。在反序列化期间删除通知会大大提高性能。
更新:我使用的是Caliburn Micro,它在PropertyChangedBase上有一个属性,可以关闭属性更改通知。然后我添加了以下内容:
[OnDeserializing]
public void OnDeserializing(StreamingContext context)
{
IsNotifying = false;
}
[OnDeserialized]
public void OnDeserialized(StreamingContext context)
{
IsNotifying = true;
}
答案 1 :(得分:1)
尝试使用WP7的免费EQATEC Profiler分析您的应用。真正的问题可能是一些完全出乎意料且容易修复的问题,比如Nigel提到的INotifyPropertyChanged示例。
答案 2 :(得分:1)
您可以使用应用程序设置快速射击自己。问题是它们总是“批量”序列化/反序列化并加载到内存中,所以除非你的对象非常小,否则会导致内存和性能问题。
我仍然想知道需要1500个物体。你真的需要1500个整个对象,如果是这样,为什么 - 最终手机向用户展示了一些东西,没有用户可以同时处理1500位信息。他们只能处理所呈现的信息,不是吗?那么您可以显示对象的可能部分,并等待以后加载其他部分吗?例如,如果我有2000个联系人,我将永远不会加载2000个联系人。我可能加载2000个名称,让用户过滤/排序名称,然后当他们选择一个名称加载联系人。
我建议将此序列化为隔离存储作为文件。内置的JSON序列化程序在磁盘上占用的空间最小,性能也很好。
答案 3 :(得分:1)
Here是关于序列化的帖子。使用二进制或Json.Net。
答案 4 :(得分:0)
存储/恢复到ApplicationSettings也将涉及序列化(非常确定它是Xml)所以我认为你不会比你看到的16秒更快。
无论deerializer有多好,移动那些数据都不会很快。我的建议是看看为什么要存储那么多对象。如果您无法减少需要存储的对象集,请将它们分解为逻辑组,以便您可以按需加载而不是预先加载。
答案 5 :(得分:0)
您是否尝试过使用多个较小的文件并[并]并行序列化以查看是否会更快?