Serialization 为什么';MVVMT是否具有导航对象的内部序列化?

Serialization 为什么';MVVMT是否具有导航对象的内部序列化?,serialization,navigation,viewmodel,mvvmcross,Serialization,Navigation,Viewmodel,Mvvmcross,我看过一些讨论MvvmCross中视图模型之间传递导航对象的线程(例如和),我想知道为什么MvvmCross没有为复杂类型的序列化构建int支持 让我澄清一下。如果我有一个由CustomerName(字符串)和RecentPurchases(列表)组成的导航对象,其中PurchaseType是一个具有一些基本类型属性的类,那么当我将此导航对象传递给ShowViewModel时,在接收端,我将获得正确的CustomerName,RecentPurchases为null。MvvmCross不认为列表

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

让我澄清一下。如果我有一个由CustomerName(字符串)和RecentPurchases(列表)组成的导航对象,其中PurchaseType是一个具有一些基本类型属性的类,那么当我将此导航对象传递给ShowViewModel时,在接收端,我将获得正确的CustomerName,RecentPurchases为null。MvvmCross不认为列表对于序列化来说足够简单。通过用SerializedRecentPurchases替换RecentPurchases并按如下方式分配其值,可以轻松解决此问题:

SerializedRecentPurchases = Mvx.Resolve<IMvxJsonConverter>()
                           .SerializeObject(RecentPurchases);
SerializedRecentPurchases=Mvx.Resolve()
.序列化对象(最近购买);
以类似的方式,字符串在ViewModels的Init方法中被反序列化

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

原因是什么v3中引入了导航的“简单序列化”功能,包括:

  • 我们希望消除MvvmCross对任何Json序列化程序的依赖性-我们喜欢Json.Net,我们喜欢ServiceStack文本,但我们希望人们能够在发布应用程序时,如果他们愿意的话,可以同时使用这两种文本
  • 我们的目的是,如果人们愿意,可以很容易地切换回Json
    • 这应该可以只使用设置中的一行,但当前有一个针对此的错误记录-请参阅
    • 即使有了这个开放的bug,使用一个基类和代码(如您的问题或中所示)处理4行代码仍然很容易
    • 还有一些方法可以将简单的序列化扩展到更复杂的对象,但这些方法也与这个问题有关
  • 我们想让人们更清楚地知道序列化正在发生(感觉“为什么我不能传递对象”是一个常见问题)
  • 我们试图阻止人们序列化大型对象
    • 因为这很慢
    • 而且因为WindowsPhone特别对可以使用的Xaml Uri的大小有很小的限制(有一个2050个字符的.Net
      Uri
      限制,但在这个限制之下,我相信WP限制更小——大约1100个字符)
如果MvvmCross支持这种开箱即用的场景,不是更实用吗

可能-这是“1线设置更改”的意图,目前正在阻塞

在某些情况下,传递复杂的基于列表的信息可能比较方便,而且有几种平台没有WindowsPhone的导航限制

为了帮助实现这一点,MvvmCross v3的关键目标之一是“黑猩猩项目”,也称为“CrossLight”CHIMP的目标是将MvvmCross拆分为单独的CrossCore、Binding、Mvvm和plugin层,其想法是这种结构应该使其他人更容易构建自己的应用程序框架。正因为如此,其他人现在应该很容易提供替代框架,可能包括完全不同的导航服务模式

以下是更多关于Chimp/CrossLight项目的信息:

  • v3进度幻灯片-
  • 一只黑猩猩出生了-
  • 机器人用交叉灯-
  • iOS-

然而,就MvvmCross本身而言,我个人仍然建议不要在序列化过程中传递大型复杂对象-我的导航对象很少是临时的,因此对我来说,将
键传递给对象比传递给对象本身“感觉更好”。

感谢Stuart给出了一个很好的答案。我并不完全同意JSON部分——只要我们讨论内部Mvx序列化,就不应该管使用什么序列化格式和风格。这对开发者来说是透明的。但说到保持对象的小型化,你是绝对正确的:我没有意识到,在某些移动平台上,导航对象的数据量仅限于约1000字节。尽管如此,我还是认为修复这个bug是值得的,这样就有了对小型复杂对象的内在支持。