7

IsolatedStorageWindows Phone で公開したアプリを Win 8 に移植しています。同等 のアプリに書き込もうとすると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;
       }
    }

例外は、最後の 2 行目で発生します。m_dtHistory は、サイズ 400 の文字列配列です。ApplicationDataCompositeValue固定サイズですか? または、m_dtHistory 配列をファイルに書き込む必要がありますか? WindowsPhone では、配列を .xml ファイルに直接書き込むことができますIsolatedStorageSettings

誰かがこれについて私を案内したり、リンクを提供してくれたりすると、本当に役に立ちます。

アルファ

4

4 に答える 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;
    }
于 2012-09-30T13:09:57.843 に答える
1

The name of each setting can be 255 characters in length at most. Each setting can be up to 8K bytes in size and each composite setting can be up to 64K bytes in size.

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

于 2016-01-11T07:21:39.137 に答える
0

どこかで読んだのですが、サイズが64KBであるという参照を失いました

于 2012-07-10T18:02:56.897 に答える