MVVMLight和数据序列化

时间:2013-01-09 20:08:56

标签: serialization mvvm-light

我开始使用MVVMLight来开发Windows 8商店应用。观看了一些视频后,我已经掌握了基本功能。但是我遇到了一个问题。我的每个基础模型类都继承自MVVMLight中的ObservableObject。

这工作正常,但我现在想要加载数据并将数据保存到XML。所以我用DataContract属性标记它们,我之前在非MVVM实现中使用过该属性。但是,这会在序列化时产生错误,因为它表示我的继承类也必须用此属性标记。

由于在dll中编译了ObservableCollection,我该如何管理呢?我是否必须创建一组与我的“ViewModel”样式匹配的基本(POCO样式)类,并处理它们之间的映射。或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您不希望序列化您的视图模型,您希望序列化它们的当前状态,以便在重新启动应用程序时它们可以自行重建。

所以,像这样:

public class ViewModelFoo
{
    public ViewModelFoo(ISerializationService serializationService)
    {
         _serializationService=serializationService;
         LoadDefaultData();
    }

    private void LoadDefaultData()
    {
        //Do all your loading of static data here
         FooItems=GetFooItems();
         if(_serializationService.ContainsSerializedState)
         {
              LoadSerializedState();
         }
    }

    public Observable<Foo> FooItems{get;set;}

    public Foo SelectedFooItem
    {
        get{return _fooItem;}
        set{_fooItem=value;
            RaisePropertyChanged("SelectedFooItem"); 
            _serializationService.SelecetedFooItem=value;
           }
    }

    private void LoadSerializedData()
    {
        SelectedFooItem=_serializationService.SelectedFooItem;
        ReloadData();
    }

    private void ReloadData()
    {
        //load whatever data you need.  You've now got your app back into the state it was when it was serialized;
    }
}

基本上,每次我们在屏幕上更改内容时,我们都会更新状态对象。当我们暂停app(App类中的事件)时,我们会保存状态对象。

通过这样做,我们能够存储viewmodel的状态而不是viewmodel本身。因为我们控制序列化服务,所以我们可以使用我们想要使用的任何序列化方法来保存数据。

答案 1 :(得分:0)

使用Json.Net可以基于GalaSoft.MvvmLight.ObservableObject对类进行序列化和反序列化。如果可以使用此库,那似乎是最简单的解决方案。