智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述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;
}
推荐阅读
- Android Studio错误的含义(未注释的参数会覆盖@NonNull参数)
- AppFabric安装失败MSI错误代码(1603 |文件已存在)
- 由于Windows 8中的视频卡错误,无法启动Android Emulator和Genymotion。
- Xcode 10(代码签名我的App + Framework失败,因为签署第三方依赖框架(PromiseKit)失败。适用于Xcode 9)
- 我对Sapper / Svelte有一些疑问
- Apple Framework ISA Classicifications
- 没有Android框架创建Android应用程序
- Apple Mach-O链接器错误_OBJC_CLASS _ $ _ FIRInstanceID
- Apple Vision Framework(通过观察检测微笑或幸福的面孔())