3

MvvmCross のビュー モデル間でナビゲーション オブジェクトを渡すことについて議論しているいくつかのスレッド (例:ここここ) を見てきましたが、なぜ MvvmCross に複雑な型のシリアル化に対する組み込みサポートがないのか疑問に思います。

明確にさせてください。CustomerName (文字列) と RecentPurchases (リスト) で構成されるナビゲーション オブジェクトがあり、Purchase 型がいくつかのプリミティブ型プロパティを持つクラスである場合、このナビゲーション オブジェクトを ShowViewModel に渡すと、受信側で正しい CustomerName と、RecentPurchases の null。List は、MvvmCross によってシリアル化に十分なほど単純であると認識されません。これは、RecentPurchases を SerializedRecentPurchases に置き換え、その値を次のように割り当てることで簡単に修正できます。

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

同様に、文字列は ViewModels の Init メソッドで逆シリアル化されます。

それはすべて非常に単純ですが、開発者がこれらのコード行を何度も書く手間を省くために、MvvmCross がシリアル化を実行しようとしない理由に少し当惑しています。ナビゲーション オブジェクトで大量のデータを渡す場合は注意が必要なのはわかっていますが、一方で、ナビゲーション (または永続状態) オブジェクトに単純な複合型のコレクションが含まれていることはよくあることです。 MvvmCross は、このシナリオをすぐにサポートしましたか?

4

1 に答える 1

8

ナビゲーション用の「単純なシリアル化」が v3 で導入された理由は次のとおりです。

  • 私たちは、Json シリアライザーに対する MvvmCross の依存関係を取り除きたいと考えていました
  • 必要に応じて簡単に Json に戻すことができるようにすることを意図しました。
  • シリアライゼーションが行われていることをより明確にしたかったのです (「なぜオブジェクトを渡すことができないのか」は FAQ のように感じます)。
  • 人々が大きなオブジェクトをシリアライズするのを思いとどまらせたいと思っていました
    • これは遅いので
    • 特に WindowsPhone では、使用できる Xaml Uri のサイズに非常に小さな制限があるため (.NetUriの制限は ~2050 文字ですが、その下では WP の制限はさらに小さいと思います - 約 1100 文字)。

MvvmCross がこのシナリオをそのままサポートしていれば、より実用的ではないでしょうか?

おそらく-そしてそれはhttps://github.com/MvvmCross/MvvmCross/issues/450が現在ブロックしている「1行のセットアップ変更」の意図です

複雑なリストベースの受け渡しが便利な状況がいくつかあります。また、WindowsPhone のナビゲーション制限がないプラットフォームもいくつかあります。

これを支援するために、MvvmCross v3 の主な目的の 1 つは、「CrossLight」としても知られる「Project CHIMP」でした。CHIMP の目的は、MvvmCross を個別の CrossCore、Binding、Mvvm、およびプラグイン レイヤーに分割することでした。これは、この構造により、他のユーザーが独自のアプリ フレームワークを構築しやすくするという考えです。このため、他の人が別のフレームワークを提供することは容易になるはずです。おそらく、完全に異なるナビゲーション サービス パターンが含まれます。

Project Chimp/CrossLight の詳細は次のとおりです。

ただし、MvvmCross 自体では、シリアライゼーション中に大きな複雑なオブジェクトを渡さないことを個人的にお勧めkeyます。一時的なナビゲーション オブジェクトはほとんどないため、オブジェクト自体ではなくオブジェクトに s を渡す方が一般的には「良いと感じます」 。

于 2013-10-24T11:37:52.697 に答える