目前我的项目中有2个模型,Adventurer和GameDate(我不关心这个应该或不应该是什么模型。稍后我会解决)。我有一个视图模型MainViewModel和一个视图MainView。MainView具有绑定到保存/加载命令的按钮......这就是我被卡住的地方。我非常想实现一种二进制序列化形式;我有一个功能类ObjectSerializer,其中包含MainViewModel的保存和加载命令中的相应部分,但我不知道如何“获取”对需要序列化的类实例的访问权限(在本例中),因为我从不手动实例化其中任何一个。另外,我想找到一种方法将它们全部序列化在一个文件中(游戏的典型“保存”文件)。任何在MVVM中处理过序列化的人都应该引导我完成这个过程吗?我一直坚持这一天,没有取得任何进展,这让我发疯。如果有人能提供某种例子,我将永远欠债。提前致谢;一个让我渡过难关的答案不会被认真对待。我真的在这里尝试......ObjectSerializer.csprotectedIFormatteriformatter;publicObjectSerializer(){this.iformatter=newBinaryFormatter();}publicTGetSerializedObject(stringfilename){if(File.Exists(filename)){StreaminStream=newFileStream(filename,FileMode.Open,FileAccess.Read,FileShare.Read);Tobj=(T)this.iformatter.Deserialize(inStream);inStream.Close();返回对象;}返回默认值(T);}publicvoidSaveSerializedObject(Tobj,stringfilename){StreamoutStream=newFileStream(filename,FileMode.Create,FileAccess.Write,FileShare.None);this.iformatter.Serialize(outStream,obj);outStream.Close();在处理MVVM时,您的模型(M)被封装在ViewModel(VM)中,并且仅通过您在ViewModel上显式公开的方法和属性公开给View(V)。您的ViewModel将主要用作模型和视图之间的适配器。您与应用程序层交互的所有逻辑(例如您可能需要的任何序列化)也将存在于ViewModel中,与任何特定于UI的代码分开。这样可以更轻松地测试核心应用程序代码,而不会陷入您不一定关心的事情中,例如TextBox或Label是否显示某些内容。这优于xaml.cs文件中发生的类似对象序列化。例如:考虑您的Adventurer类如下所示:publicclassAdventurer{publicstringFirstName{get;放;}publicstringLastName{get;放;}publicstringRank{得到;放;}//Knight,Warlock,Whatever}你的MainViewModel可能看起来像这样:(不要担心ViewModelBase,只是为了这个例子的目的假设它包含一些允许你的MainViewModel实现INotifyPropertyChanged的??代码,这是它的一个要求玩WPF的绑定子系统)publicclassMainViewModel:ViewModelBase{//当创建ViewModel时,填充_selectedAdventurer//一个空的Adventurer以便你的表单有一些东西//绑定到(它也可以用作“新”冒险家)私人冒险家_selectedAdventurer=newAdventurer();publicstringFirstName{get{return_selectedAdventurer.FirstName;}设置{_selectedAdventurer.FirstName=值;//下面是在我们虚构的//ViewModelBase中实现的,并且本质上是向WPF//发出一个通知事件,让它知道FirstName已更改OnPropertyChanged("FirstName");}}/*其余属性以类似的方式实现,在这个简单的例子中主要充当视图的传递加上一点绑定代码*///这些方法将容纳您的保存/加载逻辑。//为简单起见,我假设您已经知道如何将此逻辑包装在//可以绑定到视图的命令中}}publicvoidLoadAdventurer(){_selectedAdventurer=LoadFromFile();}privatevoidSerializeToFile(Adventureradventurer){//使用你的序列化器并保存到文件}privateAdventurerLoadFromFile(){//从文件加载并反序列化到Adventurer}}现在你有一个基本的ViewModel包装模型,一旦你设置了UI控件作为View的DataContext,您可以轻松地将UI控件绑定到VM上的属性由于您已经设置了ViewModel来包装Model,并且您已经正确地将ViewModel属性绑定到View,当用户在时在绑定到FirstName的文本框中输入了一个值,_selectedAdventurer.FirstName的值将直接使用该输入进行更新。本质上,底层模型的状态将始终与UI中显示的值同步。然后,当用户单击标记为Save的按钮时,您的SaveCommand将执行,这将触发代码将底层Adventurer序列化为文件、数据库或其他任何内容。这当然是一个非常简单的示例,主要用作数据输入表单,但希望它能帮助您掌握概念。为了更好地封装Adventurer绑定逻辑,您可以选择创建一个将向View公开的子AdventurerViewModel,而不是将属性直接放在MainViewModel中。也许您需要添加一个属性IEnumerableSavegameFiles,它可以绑定到DropDownList并允许用户选择他们想要加载的文件。以上就是C#学习教程:MVVM中序列化有很多麻烦分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
