【问题标题】:Windows 8 phone Saving and loading a list of ObjectsWindows 8 phone 保存和加载对象列表
【发布时间】:2014-07-24 09:59:07
【问题描述】:

我想保存并加载填充了历史条目对象的历史列表。我试图通过独立存储来做到这一点,这样当用户打开和关闭应用程序时,他们的浏览历史记录都不会丢失。它被保存,一旦单击应用程序就可以加载它。我环顾四周并在stackoverflow上看到了这个问题,我试图遵循它但遇到了很多错误。 Isolated Storage & Saving Multiple Objects.

这里是代码

HistoryEntry 类

public string URL { get; set; }
public string timestamp { get; set; }
public string date { get; set; }

主页代码:

using System.Xml.Serialization;
using System.Collections.ObjectModel;
using System.IO;

List<HistoryEntry> urls = new List<HistoryEntry>();
public HistoryEntry selectedHistory;

public MainPage()
{
    InitializeComponent();
    Deserialize<>(urls, ???);
}

void Browser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
     HistoryEntry urlObj = new HistoryEntry();
     urlObj.URL = url;
     urlObj.timestamp = DateTime.Now.ToString("HH:mm");
     urlObj.date = url.Remove(url.LastIndexOf('.'));
     urls.Add(urlObj);

     textBox1.Text = url;
     listBox.ItemsSource = null;
     listBox.ItemsSource = urls;

     Serialize(urlObj, urls);
}

private static void Serialize(string fileName, object source)
{
    var userStore = IsolatedStorageFile.GetUserStoreForApplication();
    using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Create, userStore))
    {
        XmlSerializer serializer = new XmlSerializer(source.GetType());
        serializer.Serialize(stream, source);
    }
}

public static void Deserialize<T>(ObservableCollection<T> list, string filename)
{
    list = new ObservableCollection<T>();
    var userStore = IsolatedStorageFile.GetUserStoreForApplication();
    if (userStore.FileExists(filename))
    {
        using (var stream = new IsolatedStorageFileStream(filename, FileMode.Open, userStore))
        {
            XmlSerializer serializer = new XmlSerializer(list.GetType());
            var items = (ObservableCollection<T>)serializer.Deserialize(stream);
            foreach (T item in items)
            {
                list.Add(item);
            }
        }
    }
}

Serialize 有一些无效参数,这与调用 De serialize 时相同。要发送到该方法的适当值是什么,这是否会成功保存和加载历史对象。

提前谢谢你:)

如果您需要更多详细信息,请发表评论,我很乐意进一步详细解释:)

【问题讨论】:

  • FileMode 不存在意味着您没有添加命名空间。确保你有这个。 using System.IO Namespace;
  • 谢谢,我已经修改了。尽管调用 Serialize 和 Deserialize 时仍然存在错误,因为它有一些无效的参数。 @anonshankar

标签: c# windows-phone-8 serialization deserialization isolatedstoragefile


【解决方案1】:

您是否使用 MemoryStream 尝试过这种方式,它确实适用于 Win 8:

Serialize

MemoryStream sessionData = new MemoryStream();
DataContractSerializer serializer = new 
DataContractSerializer(typeof(ObservableCollection<NewsByTag>));
serializer.WriteObject(sessionData, data);
StorageFile file = await ApplicationData.Current.LocalFolder
                     .CreateFileAsync(sFileName);
using (Stream fileStream = await file.OpenStreamForWriteAsync())
{
sessionData.Seek(0, SeekOrigin.Begin);
await sessionData.CopyToAsync(fileStream);
await fileStream.FlushAsync();
}

回复Deserialize

StorageFile file = await ApplicationData.Current.LocalFolder.
                       GetFileAsync(sFileName);
using (IInputStream inStream = await file.OpenSequentialReadAsync())
{
DataContractSerializer serializer = 
new DataContractSerializer(typeof(ObservableCollection<NewsByTag>));
var data = (ObservableCollection<NewsByTag>)serializer
                 .ReadObject(inStream.AsStreamForRead());
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多