为什么MvvmCross没有导航对象的内在序列化?

Vag*_*lov 3 navigation serialization viewmodel mvvmcross

我已经看过几个讨论在MvvmCross中的视图模型之间传递导航对象的线程(例如这里这里),我想知道为什么MvvmCross没有对复杂类型的序列化的内置int支持.

让我澄清一下.如果我有一个导航对象,其中包含CustomerName(字符串)和RecentPurchases(List),其中Purchase类型是一个具有一些基本类型属性的类,那么当我将此导航对象传递给ShowViewModel时,在接收端我会得到一个更正RecentPurchases的CustomerName和null.MvvmCross无法识别列表对序列化的简单性.通过将SerialPurchases替换为SerializedRecentPurchases并将其值分配如下,可以轻松解决此问题:

SerializedRecentPurchases = Mvx.Resolve<IMvxJsonConverter>()
                           .SerializeObject(RecentPurchases);
Run Code Online (Sandbox Code Playgroud)

以类似的方式,在ViewModels的Init方法中对字符串进行反序列化.

这一切都非常简单,但我有点困惑为什么MvvmCross不会尝试执行序列化,以免开发人员一次又一次地编写这些代码行.我知道我们必须小心使用导航对象传递大量数据,但另一方面,导航(或持久状态)对象可能包含简单复杂类型的集合是很常见的,所以如果不是更实用的话MvvmCross开箱即用支持这种情况?

Stu*_*art 8

在v3中引入导航"简单序列化"的原因是:

  • 我们希望消除MvvmCross对任何Json序列化程序的依赖 - 我们喜欢Json.Net并且我们喜欢ServiceStack Text 但是我们希望人们能够在没有这些的情况下发送应用程序,如果他们想要
  • 我们打算如果人们愿意,很容易切换回Json
    • 这应该可以在设置中使用一行 - 但是目前有一个错误记录 - 请参阅https://github.com/MvvmCross/MvvmCross/issues/450
    • 即使有这个开放的bug,使用基类和代码就可以很容易地处理~4行,如你的问题或链接问题所示
    • 还有一些方法可以将简单的序列化扩展到更复杂的对象 - 但这些也与450问题相关联.
  • 我们想让人们更清楚地看到序列化正在发生(感觉'为什么我不能传递一个对象'是一个FAQ)
  • 我们想试图阻止人们序列化大型物体
    • 因为这很慢
    • 并且因为WindowsPhone对可以使用的Xaml Uri的大小有很小的限制(有Uri〜2050个字符的.Net 限制,但在此之下我认为WP限制仍然更小 - 大约1100个字符)

如果MvvmCross开箱即用支持这种情况,那会不会更实际?

可能 - 这就是"1行设置更改"的意图,https://github.com/MvvmCross/MvvmCross/issues/450目前正在阻止

在某些情况下,传递复杂的基于列表可能很方便 - 并且有几个平台没有WindowsPhone的导航限制.

为了解决这个问题,MvvmCross v3的主要目标之一是"Project CHIMP",也称为"CrossLight".CHIMP的目标是将MvvmCross拆分为单独的CrossCore,Binding,Mvvm和插件层 - 这个结构应该让其他人更容易构建自己的应用程序框架.因此,现在其他人应该很容易提供替代框架 - 可能包括完全不同的导航服务模式.

Project Chimp/CrossLight还有更多内容:

但是,在MvvmCross本身内部,我个人仍然建议不要在序列化过程传递大型复杂对象 - 我的导航对象很少是临时的,所以对我来说,通常"感觉更好"将keys 传递给对象而不是对象本身.