2013-10-24 2 views
3

Я рассмотрел несколько тем, посвященных прохождению объектов навигации между моделями просмотра в MvvmCross (например, here и here), и мне интересно, почему MvvmCross не имеет встроенной поддержки для сериализации сложных типов.Почему у MvvmCross нет встроенной сериализации объектов навигации?

Позвольте пояснить. Если у меня есть объекты навигации, которые состоят из имени CustomerName (string) и RecentPurchases (List), где Тип покупки - это класс с несколькими свойствами примитивного типа, тогда, когда я передаю этот навигационный объект ShowViewModel, на принимающей стороне я получу исправить имя_имени и null для RecentPurchases. Список не распознается MvvmCross как достаточно простой для сериализации. Это может быть легко исправлена ​​путем замены RecentPurchases с SerializedRecentPurchases и присвоение его значения, как это:

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

Аналогичным образом строка десериализуется в методе Init ViewModels.

Все это очень просто, но я немного озадачен тем, что MvvmCross не пытается выполнять сериализацию, экономя разработчикам от написания этих строк кода снова и снова. Я знаю, что мы должны быть осторожны с передачей больших объемов данных с навигационными объектами, но, с другой стороны, довольно распространено, что объекты навигации (или постоянного состояния) могут содержать коллекции простых сложных типов, поэтому было бы более практичным, если бы MvvmCross поддерживал этот сценарий из коробки?

ответ

8

Причины, почему «простая сериализация» для навигации была введена в версии 3 были:

  • Мы хотели, чтобы удалить зависимость MvvmCross на любом Json сериализаторе - мы любим Json.Net и мы любим ServiceStack текст но мы хотели, чтобы люди могли судовым приложение ни с одним из них, если они хотели
  • мы Подразумеваемся, что это будет легко переключиться обратно в Json, если люди хотели
    • это должно быть возможно только с использованием одна строка в настройке - но есть ошибка, которая в настоящее время зарегистрирована в этом отношении - см. https://github.com/MvvmCross/MvvmCross/issues/450
    • даже с этой открытой ошибкой, это все еще легко сделать с ~ 4 строками, используя базовый класс и код, как показано на вашем вопросе, или в the linked question
    • Существуют также способы, с помощью которых простая сериализация должна быть расширяемой для более сложных объектов, но они также связаны с этой проблемой 450.
  • Мы хотели, чтобы сделать его более очевидным для людей, которые сериализации происходившего (он чувствует, как «почему я не могу передать объект» является FAQ)
  • Мы хотели, чтобы попытаться отговорить людей от serialising крупные объекты
    • , потому что это медленно
    • и потому WindowsPhone, в частности, имеет совсем небольшие ограничения на размер Xaml Ури, который может быть использован (есть предел ~ 2050 символов .Net Uri, но под этим Я считаю, что предел WP меньше - около 1100 символов)

не было бы более практичным, если MvvmCross поддержали этот сценарий из коробки?

Возможно - и это намерение «1 линия изменения настройки», который https://github.com/MvvmCross/MvvmCross/issues/450 в настоящее время блокировки

Есть ситуации, в которых Попутно комплексе на основе списка может быть удобно - и есть несколько платформ, которые не имеют ограничений на навигацию для WindowsPhone.

Чтобы помочь в этом, одной из ключевых задач MvvmCross v3 была «Project CHIMP», также известная как «CrossLight». Цель CHIMP заключалась в том, чтобы разделить MvvmCross на отдельные слои CrossCore, Binding, Mvvm и плагинов - идея состоит в том, что эта структура упростит другим создавать собственные платформы приложений. Из-за этого, должно быть легким для других теперь, чтобы предоставить альтернативные рамки - возможно, включая совершенно разные шаблоны навигационных сервисов.

Там больше на проект Chimp/CrossLight в:

Howeve r, внутри самого MvvmCross я бы по-прежнему рекомендовал против, передавая большие сложные объекты во время сериализации - очень немногие из моих навигационных объектов являются временными, поэтому мне, как правило, «кажется лучше» передавать key s объектам, а не самим объектам.

+0

Спасибо, Стюарт, за отличный ответ. Я не полностью согласен с частью JSON - пока мы говорим о внутренней сериализации Mvx, не имеет значения, какой формат сериализации и какой вкус используется. В любом случае это будет прозрачным для разработчиков. Но когда дело доходит до хранения мелких объектов, вы абсолютно правы: я не знал о том, что на некоторых мобильных платформах вы ограничены всего лишь ок. 1000 байтов данных для навигационных объектов. Тем не менее, я думаю, что стоит исправить эту ошибку, поэтому для небольших сложных объектов будет неотъемлемая поддержка. –

Смежные вопросы