Сохранить экземпляр пользовательского класса в IsolatedStorage в Silverlight - PullRequest
1 голос
/ 12 сентября 2011

Мне нужно хранить различные объекты в 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 Ответ

2 голосов
/ 12 сентября 2011

Моим первоначальным предположением была бы проблема сериализации.У всех ваших свойств есть публичные сеттеры?Опубликуйте классы, которые вы храните, и код, который вы используете для их хранения.

Я считаю, что IsolatedStorageSettings по умолчанию использует DataContractSerializer.Если вы хотите, чтобы ExtentHistory была сериализована, вам следует прочитать, что вам нужно сделать, чтобы он работал правильно с этим сериализатором:

DataContractSerializer Class

Возможно, высоздать отдельный объект строго с целью хранения данных в изолированном хранилище (вроде как DTO).Это позволит вам сохранить ExtentHistory как есть.

...