ApplicationDataCompositeValue的大小

智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述ApplicationDataCompositeValue的大小相关的知识,希望能为你提供帮助。
我将我在Windows Phone中发布的应用程序移植到Win 8.在尝试写入IsolatedStorage等效的ApplicationDataContainer时,我得到了一个例外。例外说

错误:状态管理器设置的大小已超出限制
我不确定这是否是使用ApplicationDataContainer的正确方法。
public void WriteToIsolatedStorage() { try {ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; ApplicationDataCompositeValue composite = new ApplicationDataCompositeValue(); if (localSettings.Containers.ContainsKey("LoveCycleSetting")) { localSettings.DeleteContainer("LoveCycleSetting"); }composite["GetWeekStart"] = m_bWeekStart; composite["iHistCount"] = m_iHistCount; composite["dtHistory"] = this.DateTimeToString(m_dtHistory); composite["avgCycleTime"] = m_iAvgCycleTime; } }

例外发生在倒数第二行。 m_dtHistory是一个大小为400的字符串数组。所以ApplicationDataCompositeValue的大小是固定的吗?或者我必须将m_dtHistory数组写入文件?在WindowsPhone中我可以直接将数组写入IsolatedStorageSettings
如果有人可以指导我或提供链接,那将是非常有帮助的。
写下来
答案是的,具有讽刺意味的是,手机上的设置存储比WinRT更容易。您只需序列化为文件即可。这就是我所做的(部分复制自SuspensionManager.cs中的代码),它适用于值和引用类型。
internal static async Task< bool> SaveSetting(string Key, Object value) { var ms = new MemoryStream(); DataContractSerializer serializer = new DataContractSerializer(value.GetType()); serializer.WriteObject(ms, value); await ms.FlushAsync(); // Uncomment this to preview the contents being written /*char[] buffer = new char[ms.Length]; ms.Seek(0, SeekOrigin.Begin); var sr = new StreamReader(ms); sr.Read(buffer, 0, (int)ms.Length); */ms.Seek(0, SeekOrigin.Begin); StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(Key, CreationCollisionOption.ReplaceExisting); using (Stream fileStream = await file.OpenStreamForWriteAsync()) { await ms.CopyToAsync(fileStream); await fileStream.FlushAsync(); } return true; }// Necessary to pass back both the result and status from an async function since youcan't pass by ref internal class ReadResults { public bool Success { get; set; } public Object Result { get; set; } } internal async static Task< ReadResults> ReadSetting< type> (string Key, Type t) { var rr = new ReadResults(); try { var ms = new MemoryStream(); DataContractSerializer serializer = new DataContractSerializer(t); StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(Key); using (IInputStream inStream = await file.OpenSequentialReadAsync()) { rr.Result = (type)serializer.ReadObject(inStream.AsStreamForRead()); } rr.Success = true; } catch (FileNotFoundException) { rr.Success = false; } return rr; }

另一答案
每个设置的名称最多可以包含255个字符。每个设置的大小最多为8K字节,每个复合设置的大小最多为64K字节。
https://msdn.microsoft.com/library/windows/apps/windows.storage.applicationdata.localsettings.aspx
另一答案【ApplicationDataCompositeValue的大小】我在某处读过但丢失了大小为64KB的引用
另一答案
public static void StoreConfig(string content) { IEnumerable< string> strs = Split(content, 2000); int i = 1; foreach(var s in strs) { AppLocalSettings.Values["test" + (i++)] = s; }AppLocalSettings.Values["test_count"] =i-1 +""; }public static string ReadConfig() { string s = ""; int count = Convert.ToInt32(AppLocalSettings.Values["test_count"]); for(int i = 1; i< =count; i++) { s += Convert.ToString(AppLocalSettings.Values["test" + (i)]); } return s; }


    推荐阅读