【问题标题】:Error saving and getting an ObservableCollection in IsolatedStorage在 IsolatedStorage 中保存和获取 ObservableCollection 时出错
【发布时间】:2012-09-25 04:08:27
【问题描述】:

我一直在使用一个辅助类,它使用键值对从隔离存储中保存和检索值。这适用于在我的应用程序中更改的各个值,但我现在正尝试将其用于 ObservableCollection,其中将在运行时添加和删除项目。出于某种原因,当应用程序关闭并重新打开时,我的 ObservableCollection 不会从 IsolatedStorage 中存储和/或检索。我不确定我做错了什么,因为这适用于个人价值观吗?

设置.cs

public class Setting<T>
{
    string name;
    T value;
    T defaultValue;
    bool hasValue;

    public Setting(string name, T defaultValue)
    {
        this.name = name;
        this.defaultValue = defaultValue;
    }

    public T Value
    {
        get
        {
            //Check for the cached value
            if (!this.hasValue)
            {
                //Try to get the value from Isolated Storage
                if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue(this.name, out this.value))
                {
                    //It hasn't been set yet
                    this.value = this.defaultValue;
                    IsolatedStorageSettings.ApplicationSettings[this.name] = this.value;
                }
                this.hasValue = true;
            }
            return this.value;
        }

        set
        {
            //Save the value to Isolated Storage
            IsolatedStorageSettings.ApplicationSettings[this.name] = value;
            this.value = value;
            this.hasValue = true;
        }
    }

    public T DefaultValue
    {
        get { return this.defaultValue; }
    }

    // Clear cached value
    public void ForceRefresh()
    {
        this.hasValue = false;
    }
}

上面的 Setting.cs 类用于存储和检索值,我正在使用另一个名为 Settings.cs 的类作为使用这些存储值的机制。

Settings.cs

public static Setting<ObservableCollection<BrowserItem>> BrowserList = new Setting<ObservableCollection<BrowserItem>>("Browsers", new ObservableCollection<BrowserItem>());
    public static Setting<string> InitialUri = new Setting<string>("InitialUri", "http://www.bing.com");

在上面,InitialUri 可能会被更改并且值被正确保存和检索。另一方面,BrowserList(BrowserItem 类型的 ObservableCollection(自定义类))没有存储或保存?下面显示了我如何尝试使用BrowserList

BrowserItem.cs

[DataContract]
public class BrowserItem

{
    [DataMember]
    public FullWebBrowser Browser
    {
        get;
        set;
    }
    [DataMember]
    public string Url
    {
        get;
        set;
    }
    [DataMember]
    public BitmapImage ImageUri
    {
        get;
        set;
    }
    [DataMember]
    public string Title
    {
        get;
        set;
    }
    [DataMember]
    public string Notification
    {
        get;
        set;
    }
    [DataMember]
    public bool DisplayNotification
    {
        get
        {
            return !string.IsNullOrEmpty(this.Notification);
        }
    }
    [DataMember]
    public string Message
    {
        get;
        set;
    }
    [DataMember]
    public string GroupTag
    {
        get;
        set;
    }
    [DataMember]
    //for translation purposes (bound to HubTile Title on MainPage) 
    public string TileName
    {
        get;
        set;
    }
}

TabsPage.xaml.cs

void addNew_Click(object sender, EventArgs e)
    {
        BitmapImage newTileImage = new BitmapImage();

        var newItem = new BrowserItem() { Browser = new FullWebBrowser(), Url = "http://www.bing.com", ImageUri = newTileImage, Title = "new", /*Notification = "",*/ Message = "new browser", GroupTag = "TileGroup", TileName = "new" };
        newItem.Browser.InitialUri = Settings.InitialUri.Value; //set the initial uri when created
        Settings.BrowserList.Value.Add(newItem); //update saved BrowserList
    }

addNew_Click偶数处理程序中,成功添加了名为newItem的新BrowserItem。但是,当应用程序关闭或重新打开时,我会检查 BrowserList 以查看项目是否存在,如果存在,我想根据 ObservableCollection 中的项目索引值加载特定的项目。每次我执行检查,BrowserList 没有保存的项目?如何正确地将这些值保存在集合中,以便它们持久存在?

【问题讨论】:

    标签: c# windows-phone-7 isolatedstorage


    【解决方案1】:

    这可能是由于 observable 集合中包含的类型的序列化失败。 首先,您的 BrowserItem 类型需要通过实现序列化接口的继承或应用 [Serializable] 属性来标记为可序列化:

    [Serializable]
    public class BrowserItem
    {
    
    }
    

    事实上,如果 BrowserItem(或您尝试保存到设置的任何其他类型)是可序列化的,那么您可能会得到 this Q/A 的帮助。

    同样,如果您的类型已经是可序列化的,您可能希望将集合的样本序列化到磁盘中的 xml 文件中,这样您就可以手动/直观地检查在您的类型时可能导致问题的原因(如果有的话)被序列化/反序列化

    【讨论】:

    • 好的,我的项目中需要参考什么才能使用Serializable
    • 属性为:System.SerializableAttribute,所以只要:使用System;在你的类文件的顶部,你可以用 [Serializable] 来装饰你的类定义。
    • 好的,我在 Windows Phone 上使用 .NET,所以我必须引用 System.Runtime.Serialization 并改用 [DataContract] 而不是 [Serialization]。我在上面添加了我的BrowserItem 自定义类,尽管我不确定我这样做是否正确? ObservableColletion&lt;BrowserItem&gt; 仍然没有得到保存的值。
    • 做得很好。现在,我认为您需要将您的 bitmapimage 属性存储为字节数组(byte []),以便正确序列化它。这可能是它的一部分...您拥有的和/或“FullWebBrowser”类型的属性未标记为可序列化? 'FullWebBrowser' 是您在某处定义的类吗?如果是这样,请确保它也是可序列化的。
    • 要将您的位图图像存储为字节,请查看:stackoverflow.com/questions/4308777/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多