如何将对象存储到Windows Phone 8.1

时间:2014-08-11 09:09:54

标签: windows-phone-8.1

在wp8.0中,我们可以将对象存储到IsolatedStorageSettings。 wp8.1对象没有存储。有没有办法将对象存储到wp8.1。

写对象代码

NewsList = new ObservableCollection<New>(e.News);
                var FileName = "News.xml";
                DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<New>));

                var localFolder = ApplicationData.Current.LocalFolder;
                var file = await localFolder.CreateFileAsync(FileName,CreationCollisionOption.ReplaceExisting);
                IRandomAccessStream sessionRandomAccess = await file.OpenAsync(FileAccessMode.ReadWrite);
                IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0);
                serializer.WriteObject(sessionOutputStream.AsStreamForWrite(), NewsList);

阅读对象代码

var FileNameNews = "News.xml";
                DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<New>));
                var localFolder = ApplicationData.Current.LocalFolder;

                var newsFile = await localFolder.GetFileAsync(FileNameNews);

                IInputStream sessionInputStream = await newsFile.OpenReadAsync();
                newsVM = new NewsViewModel();
                NewsVM.NewsList = (ObservableCollection<New>)serializer.ReadObject(sessionInputStream.AsStreamForRead());

我在此链接上收到错误

IInputStream sessionInputStream = await newsFile.OpenReadAsync();

这段代码有什么错误?

由于

1 个答案:

答案 0 :(得分:1)

我就是这样做的。没有使用陈述。我尽量避免使用Stream语法。

您的错误很可能是因为并发(同时访问同一文件会引发异常),或者因为流未正确关闭。我认为是后者。

您没有正确处理Stream对象(学习using(){}语法),这意味着在您完成写入后,流仍然处于打开状态。这意味着您在第二次编写时遇到了并发问题,因为您正在尝试访问已经打开的流。


    public async Task CreateOrUpdateData(string key, object o)
    {
        try
        {
            if (o != null)
            {
                var sessionFile = await _localFolder.CreateFileAsync(key, CreationCollisionOption.ReplaceExisting);
                var outputString = JToken.FromObject(o).ToString();
                await FileIO.WriteTextAsync(sessionFile, outputString);
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine("Encountered exception: {0}", e);
        }
    }

    public async Task<T> GetDataOrDefault<T>(string key, T defaultValue)
    {
        try
        {
            T results = defaultValue;

            var sessionFile = await _localFolder.CreateFileAsync(key, CreationCollisionOption.OpenIfExists);
            var data = await FileIO.ReadTextAsync(sessionFile);

            if (!String.IsNullOrWhiteSpace(data))
            {
                results = JToken.Parse(data).ToObject<T>();
            }

            return results;
        }
        catch (Exception e)
        {
            Debug.WriteLine("Encountered exception: {0}", e);
        }

        return defaultValue;
    }