Nano Hash - криптовалюты, майнинг, программирование

Почему MvvmCross не имеет встроенной сериализации объектов навигации?

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

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

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

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

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


Ответы:


1

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

  • Мы хотели устранить зависимость MvvmCross от любого сериализатора Json — мы любим Json.Net и ServiceStack Text, но мы хотели, чтобы люди могли отправлять приложения ни с одним из них, если захотят.
  • We intended that it would be easy to switch back to Json if people wanted to
    • this should be possible using just one line in setup - but there's a bug currently logged against this - see https://github.com/MvvmCross/MvvmCross/issues/450
    • даже с этой открытой ошибкой это все еще легко сделать с помощью ~ 4 строк, используя базовый класс и код, подобный показанному в вашем вопросе или в связанный вопрос
    • есть также способы расширения простой сериализации до более сложных объектов, но они также связаны с проблемой 450.
  • Мы хотели сделать более очевидным для людей, что происходит сериализация (такое ощущение, что «почему я не могу передать объект» — это часто задаваемые вопросы).
  • We wanted to try to discourage people from serialising large objects
    • because this is slow
    • и потому, что WindowsPhone, в частности, имеет довольно небольшие ограничения на размер Xaml Uri, который можно использовать (существует ограничение .Net Uri ~ 2050 символов, но ниже этого я считаю, что ограничение WP еще меньше - около 1100 символов)

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

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

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

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

Больше информации о Project Chimp/CrossLight можно найти в:

Тем не менее, внутри самого MvvmCross я лично по-прежнему рекомендовал бы против передавать большие сложные объекты во время сериализации - очень немногие из моих навигационных объектов являются временными, поэтому мне обычно "лучше" передавать keys объектам, а не сами объекты.

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..