2011-09-12 11 views
1

異なるオブジェクトをIsolatedStorageに保存する必要があり、そのためにIsolatedStorageSettingsクラスを使用しています。そのオブジェクトの中には、そのように格納され、よく取り出される基本型があります。しかし、それらのいくつかはカスタムクラスインスタンスであり、それらはうまく格納されますが、それらを取得しようとすると、初期値を持つインスタンスが取得されます。 カスタムクラスインスタンスをIsolatedStorageに保存して取得するにはどうすればよいですか?SilverlightでIsolatedStorageにカスタムクラスインスタンスを保存

Phil Sandler、そうだね。しかし、私はどのようなタイプのシリアル化を使用して分離ストレージを知っていないので、私は自分のクラスをシリアル化する方法を知らない。プライベートフィールドも保存する必要があります。ここ は、カスタムクラスのコードです:

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; 
} 

私は私が作りたい、手動で追加するには、すべてのオブジェクトをシリアル化する必要はありません可能であれば、独立したストレージに格納するためにデフォルトで直列化可能なカスタムクラスです。

答えて

2

私の最初の推測はシリアル化の問題です。すべての不動産にパブリックセッターがいますか?あなたが保存しているクラスとそれらを保存するために使用しているコードを投稿してください。

IsolatedStorageSettingsはデフォルトでDataContractSerializerを使用していると思います。あなたはExtentHistoryをシリアル化したい場合、あなたはそれがこのシリアライザで正しく動作させるために何をする必要があるかをよく読んでください。

DataContractSerializer Class

あなたが保存の目的のために厳密に別のオブジェクトを作成することができます隔離されたストレージのデータ(DTOのよ​​うなもの)。これにより、ExtentHistoryをそのままの状態に保つことができます。

+0

私の編集した投稿を見てください –

+0

私の答えを更新しました。 –

+0

返事ありがとうございます。それが解決策です。 –

関連する問題