ApplicationDataCompositeValue的大小

问题描述 投票:7回答:4

我将我在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

如果有人可以指导我或提供链接,那将是非常有帮助的。

写下来

c# windows-8 microsoft-metro
4个回答
6
投票

是的,具有讽刺意味的是,手机上的设置存储比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 you  can'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;
    }

1
投票

每个设置的名称最多可以包含255个字符。每个设置的大小最多为8K字节,每个复合设置的大小最多为64K字节。

https://msdn.microsoft.com/library/windows/apps/windows.storage.applicationdata.localsettings.aspx


0
投票

我在某处读过但丢失了大小为64KB的引用


0
投票
    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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.