我正在尝试将整个viewmodel保存到IsolatedStorage设置中。它非常大,因为它包含许多其他虚拟机。
当我尝试读取该值时,它会抛出“IsolatedStorageFileStream上不允许操作”错误。这似乎是一个红鲱鱼,因为我没有使用文件,我使用的是IsolatedStorageSettings类。
我检查了本地应用程序数据目录下的__LocalSettings文件,它似乎在16k处被截断(在XML元素名称的中间)。我怀疑它有16k的限制,因此在下次加载时,IsolatedStorage类将其视为无效文件并抛出一个拟合(然后将其空白回到空文件中)。
我想确认使用IsolatedStorageSettings时所有设置的大小限制是否为16k?
它的一些方法是将其序列化为文件并重新水化而不是使用“设置”或根本不使用此方法(存储更少的信息)。在任何人有更好的主意,请告诉我?
答案 0 :(得分:2)
IsolatedStorageFile.IncreaseQuotaTo
是你的朋友。
还要查看IsolatedStorageFile
类的各种方法。
请参阅示例here(请参阅“如何修改配额的示例?”部分)和here。
更新
另一方面,也许尝试通过设置外部文件的地址来增加设置文件的大小,而不是将它们嵌入到设置本身中,例如,如果你有一个大的xml文件,只需将设置设置为处理和处理设置文件的事件(我假设它是ApplicationSettingsBase
的子类)。
答案 1 :(得分:1)
好的,经过更多的调查和拉毛后,16k的限制似乎是一个红鲱鱼。它可能是相关的,但实际问题是序列化问题。
这里似乎有两个问题,关于将复杂类型序列化为IsolatedStorageSettings。第一个是上面提到的那个,其中_LocalSettings类在XML元素的中途被截断到16k。这导致在IsolatedStorageFileStream"上不允许"操作。例外。第二个是较小的复杂类型 - 在检查_LocalSettings的内容之后,它似乎写入了它,但是在NEXT时间你加载应用程序的第一个Settings.Save擦除所有现有设置(即它不加载现有的那些并重新安置他们)。这使_LocalSettings再次重置为空白(即,所有设置都不会保留)。
问题是我的一个基类型(顺便提一下MVVM Light ViewModelBase - read more about this here)没有一个公共的无参数构造函数,因此不能序列化(没有警告,它只是表现出奇怪的以上行为。
你必须退出程序才能实现这一点 - 当你在这样的写入之后读取设置它工作正常 - 我怀疑Silverlight在完全退出后在幕后做了更多。如果有人能证实这一点??
只要我将基类序列化,它就会再次运行。