2013-10-24 53 views
3

我已經看過一些討論在MvvmCross視圖模型之間傳遞導航對象的線索(例如herehere),我想知道爲什麼MvvmCross沒有內建的對複雜類型序列化的支持。爲什麼MvvmCross沒有導航對象的內在序列化?

讓我澄清一下。如果我有一個由客戶名稱(字符串)和RecentPurchases(列表)的瀏覽對象,其中購買的類型是用幾個基本類型屬性的類,然後當我通過此導航對象ShowViewModel,在接收側I將得到一個正確的CustomerName和null爲RecentPurchases。列表不被MvvmCross識別爲足夠簡單的序列化。這可以很容易地固定通過用SerializedRecentPurchases替換RecentPurchases並分配它的值是這樣的:

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

以類似的方式將字符串中的ViewModels' Init方法反序列化。

現在的情況很簡單,但我有點不解,爲什麼MvvmCross不嘗試從一次又一次地寫幾行代碼進行系列化開發節能。我知道我們必須要小心傳遞大量的數據與導航的對象,但在另一方面,它是相當常見的導航(或持續狀態)的對象可能包含簡單的複雜類型的集合,所以它不會是,如果更實際MvvmCross支持這種開箱即用的方案嗎?

回答

8

爲什麼「簡單的序列化」導航v3中引入的理由是:

  • 我們希望,以消除任何JSON序列MvvmCross的依賴 - 我們愛Json.Net,我們愛ServiceStack文本我們希望人們能夠船舶應用與沒有這些,如果他們想
  • 我們預期,這將是很容易切換到JSON如果人們想
    • 這應該只使用成爲可能設置一行 - 但有一個錯誤當前登錄對此 - 看到https://github.com/MvvmCross/MvvmCross/issues/450
    • 即使有這個開放的bug,它仍然很容易做~4行使用基類和類似於你的問題所示的代碼或在the linked question
    • 也有辦法了簡單的序列應該是可擴展到更復雜的對象 - 但這些都還鏈接到450的問題。
  • 我們想讓它更有目共睹的是序列化正在發生(的感覺就像「我爲什麼不能傳遞一個對象」是一個FAQ)
  • 我們想嘗試從連載勸阻的人大的對象
    • 因爲這是緩慢
    • 和因爲WindowsPhone的尤其對可使用的(有〜的字符2050。淨Uri限制XAML中URI的尺寸相當小的限制,但下面說我相信WP的限制更小 - 大約1100個字符)

,那豈不是更實際的,如果MvvmCross支持此方案的開箱?

可能 - 那就是「1號線的設置變化」,這https://github.com/MvvmCross/MvvmCross/issues/450當前正在阻止

有些情況下路過基於列表的複雜的可能是方便的意圖 - 有幾個平臺,其沒有WindowsPhone的導航限制。

爲了解決這個問題,的MvvmCross V3的主要目標之一是「項目CHIMP」也被稱爲「Crosslight公司」。 CHIMP的目的是來拆分MvvmCross成單獨的CROSSCORE,裝訂,MVVM和插件層 - 的想法是,這種結構應該讓別人更容易建立自己的應用程序框架。正因爲如此,它應該很容易爲他人現在提供替代的框架 - 可能包括完全不同的導航服務模式。

有更多的項目黑猩猩/ Crosslight公司:

Howeve R,內MvvmCross本身我個人還是建議序列化過程中通過大量複雜的對象 - 很少有我的導航對象是臨時所以我一般「感覺更好」傳遞key s到對象,而不是對象本身。

+0

感謝斯圖爾特爲一個偉大的答案。我並不完全同意JSON部分 - 只要我們正在討論內部Mvx序列化,不管什麼序列化格式和使用哪種風味都不重要。無論如何,這對開發者來說都是透明的。但是當保持對象較小時,你是絕對正確的:我沒有意識到在一些移動平臺上,你只能使用ca.導航對象的1000字節數據。不過,我認爲值得修正這個錯誤,以便對小複雜對象有內在的支持。 –

相關問題