在Silverlight中的IsolatedStorage中存储自定义类实例

时间:2011-09-12 19:36:46

标签: silverlight isolatedstorage

我需要在IsolatedStorage中存储不同的对象,并且我正在使用IsolatedStorageSettings类来执行此操作。一些对象是基本类型,因此可以很好地存储和检索。但其中一些是自定义类实例,它们存储得很好,但是当我尝试检索它们时,我得到了具有初始值的实例。 如何在IsolatedStorage中存储自定义类实例并检索它们?

菲尔·桑德勒,我想是的。但我不知道什么类型的序列化使用隔离存储,所以我不知道如何使我的类可序列化。还必须存储私有字段。 这是自定义类的代码:

public class ExtentHistory : INotifyPropertyChanged
{
    private const int Capacity = 20;
    private List<Envelope> _extents;
    private int _currentPosition;

    public event PropertyChangedEventHandler PropertyChanged;

    public int ItemsCount
    {
        get { return _extents.Count; }
    }

    public bool CanStepBack 
    {
        get { return _currentPosition > 0; }
    }

    public bool CanStepForward 
    {
        get { return _currentPosition < _extents.Count - 1; }
    }

    public Envelope CurrentExtent 
    {
        get { return (_extents.Count > 0) ? _extents[_currentPosition] : null; }
    }

    public ExtentHistory()
    {
        _extents = new List<Envelope>();
        _currentPosition = -1;
    }

    public void Add(Envelope extent)
    {
        if (_extents.Count > Capacity)
        {
            _extents.RemoveAt(0);
            _currentPosition--;
        }

        _currentPosition++;
        while (_extents.Count > _currentPosition)
        {
            _extents.RemoveAt(_currentPosition);
        }
        _extents.Add(extent);
    }

    public void StepBack()
    {
        if (CanStepBack)
        {
            _currentPosition--;
            NotifyPropertyChanged("CurrentExtent");
        }
    }

    public void StepForward()
    {
        if (CanStepForward)
        {
            _currentPosition++;
            NotifyPropertyChanged("CurrentExtent");
        }
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

以下是存储和检索的功能:

private IsolatedStorageSettings _storage;

public void Store(string key, object value)
{
    if (!_storage.Contains(key))
    {
        _storage.Add(key, value);
    }
    else
    {
        _storage[key] = value;
    }
}

public object Retrieve(string key)
{
    return _storage.Contains(key) ? _storage[key] : null;
}

我不想手动序列化每个要添加的对象,我想默认将自定义类序列化,以将其存储在独立存储中(如果可能的话)

1 个答案:

答案 0 :(得分:2)

我的初衷猜测是序列化问题。您的所有物业都有公共制定者吗?发布您正在存储的类以及用于存储它们的代码。

我相信IsolatedStorageSettings默认使用DataContractSerializer。如果你想要ExtentHistory被序列化,你应该阅读你需要做些什么才能让它与这个序列化器一起正常工作:

DataContractSerializer Class

您可以严格创建一个单独的对象,以便将数据存储在独立存储中(有点像DTO)。这将允许您按原样保留ExtentHistory。