3

我看过一些讨论在 MvvmCross 中的视图模型之间传递导航对象的线程(例如herehere),我想知道为什么 MvvmCross 没有对复杂类型的序列化的内置支持。

让我澄清一下。如果我有一个由 CustomerName(字符串)和 RecentPurchases(列表)组成的导航对象,其中购买类型是具有一些原始类型属性的类,那么当我将此导航对象传递给 ShowViewModel 时,在接收端我会得到一个正确的 CustomerName 和最近购买的 null。MvvmCross 无法将 List 识别为足够简单的序列化。这可以通过用 SerializedRecentPurchases 替换 RecentPurchases 并像这样分配它的值来轻松解决:

SerializedRecentPurchases = Mvx.Resolve<IMvxJsonConverter>()
                           .SerializeObject(RecentPurchases);

以类似的方式,字符串在 ViewModels 的 Init 方法中被反序列化。

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

4

1 回答 1

8

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

  • 我们想消除 MvvmCross 对任何 Json 序列化程序的依赖——我们喜欢 Json.Net,我们喜欢 ServiceStack Text ,但我们希望人们能够在他们想要的情况下使用这两种方式来发布应用程序
  • 我们的目的是如果人们想要切换回 Json 会很容易
  • 我们想让人们更清楚地知道序列化正在发生(感觉就像'为什么我不能传递一个对象'是一个常见问题解答)
  • 我们想阻止人们对大型对象进行序列化
    • 因为这很慢
    • 并且因为 WindowsPhone 对可以使用的 Xaml Uri 的大小有非常小的限制(.NetUri限制约为 2050 个字符,但在此之下,我相信 WP 限制仍然更小 - 大约 1100 个字符)

如果 MvvmCross 开箱即用地支持这种情况,不是更实用吗?

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

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

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

关于 Project Chimp/CrossLight 的更多信息:

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

于 2013-10-24T11:37:52.697 回答