我有一个 Windows Store 应用程序,它管理对象集合并将它们存储在应用程序本地文件夹中。这些对象使用 JSON 在文件系统上进行序列化。由于我需要能够单独编辑和保留这些项目,因此我为每个对象选择了单独的文件,而不是一个大文件。对象按照以下模式存储:
Local Folder
|
--- db
|
--- AB283376-7057-46B4-8B91-C32E663EC964
| |
| --- AB283376-7057-46B4-8B91-C32E663EC964.json
| --- AB283376-7057-46B4-8B91-C32E663EC964.jpg
|
--- B506EFC5-E853-45E6-BA32-64193BB49ACD
| |
| --- B506EFC5-E853-45E6-BA32-64193BB49ACD.json
| --- B506EFC5-E853-45E6-BA32-64193BB49ACD.jpg
|
...
每个对象都有其文件夹节点,其中包含 JSON 序列化对象和其他最终资源。
当我进行一些写作、阅读、删除测试时,一切都很好。当我试图在应用程序启动时加载大量对象时,它变得复杂了。我估计item one的最大数量会存储到10000。所以我写了10000个条目然后尝试加载它......超过3分钟到应用程序完成操作,这当然是不可接受的。
所以我的问题是,在我为读取和反序列化对象(下面的代码)编写的代码中可以优化什么?有没有办法实现分页系统,以便在我的 WinRT 应用程序中动态加载?就 IO/CPU 而言,我的存储方法(上述模式)是否过于繁重?我在 WinRT 中遗漏了什么吗?
public async Task<IEnumerable<Release>> GetReleases()
{
List<Release> items = new List<Release>();
var dbFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(dbName, CreationCollisionOption.OpenIfExists);
foreach (var releaseFolder in await dbFolder.GetFoldersAsync())
{
var releaseFile = await releaseFolder.GetFileAsync(releaseFolder.DisplayName + ".json");
var stream = await releaseFile.OpenAsync(FileAccessMode.Read);
using (var inStream = stream.GetInputStreamAt(0))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Release));
Release release = (Release)serializer.ReadObject(inStream.AsStreamForRead());
items.Add(release);
}
stream.Dispose();
}
return items;
}
谢谢你的帮助。
注意:我已经看过 SQLite,我不需要这么复杂的系统。