我看过一些讨论在 MvvmCross 中的 View 模型之间传递导航对象的线程(例如 here 和 here ),我想知道为什么 MvvmCross 没有对复杂类型的序列化的内置支持。
让我澄清一下。如果我有一个由 CustomerName(字符串)和 RecentPurchases(列表)组成的导航对象,其中购买类型是具有一些基本类型属性的类,那么当我将此导航对象传递给 ShowViewModel 时,在接收端我会得到一个正确的 CustomerName 和最近购买的 null。 MvvmCross 无法将 List 识别为足够简单的序列化。这可以通过用 SerializedRecentPurchases 替换 RecentPurchases 并像这样分配它的值来轻松解决:
SerializedRecentPurchases = Mvx.Resolve<IMvxJsonConverter>()
.SerializeObject(RecentPurchases);
在 ViewModels 的 Init 方法中以类似的方式对字符串进行反序列化。
这一切都非常简单,但我有点疑惑为什么 MvvmCross 不尝试执行序列化来避免开发人员一次又一次地编写这些代码行。我知道我们必须小心使用导航对象传递大量数据,但另一方面,导航(或持久状态)对象可能包含简单复杂类型的集合是很常见的,所以如果MvvmCross 开箱即用支持这种场景?
最佳答案
在 v3 中引入导航的“简单序列化”的原因是:
- 我们希望消除 MvvmCross 对任何 Json 序列化程序的依赖 - 我们喜欢 Json.Net 并且我们喜欢 ServiceStack Text 但是我们希望人们能够在他们想要的情况下不使用这两种方式来发布应用程序到
- 我们希望如果人们愿意,可以很容易地切换回 Json
- 这应该可以在设置中只使用一行 - 但目前有一个针对此的错误记录 - 请参阅 https://github.com/MvvmCross/MvvmCross/issues/450
- 即使有这个 Unresolved 错误,使用基类和代码(如您的问题或 the linked question 中所示)仍然可以轻松处理约 4 行代码。
- 还有一些方法可以将简单序列化扩展到更复杂的对象 - 但这些也与 450 问题有关。
- 我们想让人们更清楚地看到序列化正在发生(感觉就像“为什么我不能传递一个对象”是一个常见问题解答)
- 我们想阻止人们对大型对象进行序列化
- 因为这很慢
- 并且因为 WindowsPhone 对可以使用的 Xaml Uri 的大小有非常小的限制(.Net
Uri
限制为 ~2050 个字符,但在此之下我相信 WP限制仍然更小 - 大约 1100 个字符)
wouldn't it be more practical if MvvmCross supported this scenario out of the box?
可能——这就是“1 行设置更改”的意图,https://github.com/MvvmCross/MvvmCross/issues/450当前正在阻止
在某些情况下,传递复杂的基于列表可能会很方便 - 并且有几个平台没有 WindowsPhone 的导航限制。
为此,MvvmCross v3 的主要目标之一是“Project CHIMP”,也称为“CrossLight”。 CHIMP 的目的是将 MvvmCross 拆分为单独的 CrossCore、Binding、Mvvm 和插件层——这种结构应该让其他人更容易构建自己的应用程序框架。正因为如此,现在其他人应该很容易提供替代框架 - 可能包括完全不同的导航服务模式。
还有更多关于 Project Chimp/CrossLight 的内容:
- v3 进度幻灯片 - http://slodge.blogspot.co.uk/2013/03/hot-tuna-mvvmcross-v3-progress.html
- 一只黑猩猩出生了 - http://slodge.blogspot.co.uk/2013/03/a-chimp-is-born-mvvm-on-monodroid.html
- Droid CrossLight - http://slodge.blogspot.co.uk/2013/06/n30-crosslight-aka-project-chimp-n1.html
- 适用于 iOS 的 CrossLight - http://slodge.blogspot.co.uk/2013/09/n39-crosslight-on-xamariniosmonotouch.html
但是,在 MvvmCross 本身中,我个人仍然建议 反对 在序列化期间传递大型复杂对象 - 我的导航对象很少是临时的,所以对我来说,传递 通常“感觉更好”对象的键
而不是对象本身。
关于serialization - 为什么 MvvmCross 没有导航对象的内在序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19563488/