Сериализация модели представления в Silverlight на Windows Phone 7

#c# #silverlight #windows-phone-7

#c# #silverlight #windows-phone-7

Вопрос:

У меня есть приложение Silverlight для Windows Phone. Когда приложение завершит работу, я хочу сохранить текущую модель представления. Во-первых, где мне сохранить модель представления?

  1. Служба приложений телефона (я не знаю, когда это появится / умрет)
  2. Изолированное хранилище

Я почти уверен, что мне следует сохранить свою модель представления в изолированном хранилище. Моя проблема в том, что я получаю сообщение об ошибке при попытке поместить его в изолированное хранилище. Ошибка гласит:

Тип ‘MyViewModel’ не может быть сериализован. Подумайте о том, чтобы пометить ее атрибутом DataContractAttribute и пометить все ее элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute.

Моя проблема в том, что у меня МНОГО участников в этой модели представления. В то же время у него есть дочерние объекты, у которых также есть члены. Такое ощущение, что это загрязняет мой код. Кажется странным, что я могу успешно разместить модель представления в PhoneApplicationService без каких-либо проблем. Однако я получаю эту ошибку только при попытке поместить ее в изолированное хранилище.

Как мне преодолеть это? Я просто хочу сохранить модель представления во время надгробия. Спасибо!

Комментарии:

1. Сколько состояний вы храните в своей виртуальной машине? В идеале вы должны иметь возможность создать новую виртуальную машину с сохраненным объектом Model.

Ответ №1:

Состояние PhoneAppService не сохранит данные, если приложение завершит работу через некоторое время после того, как оно было захоронено. Хранилище Iso — это дисковое хранилище, тогда как PhoneAppService.Состояние — это всего лишь словарь переходного состояния, который переживает надгробие.

Ответ №2:

Создание надгробий в реальном мире в Silverlight для Windows Phone от Джеффа Просиса должно рассказать вам практически все, что вам нужно знать о надгробиях.

Ответ №3:

Во-первых, вам действительно нужно сохранять всю виртуальную машину? Возможно, это то, что вам нужно для вашего приложения; но я бы все же попросил вас рассмотреть возможность сохранения только тех битов, которые вам абсолютно необходимы, и повторно создавать экземпляры вашей виртуальной машины по мере необходимости. Тем не менее, изолированное хранилище — это то, куда вы можете поместить что-то для сохранения.

Вы могли бы использовать класс IsolatedStorageSettings для хранения данных типа пары ключ-значение. Кроме того, пожалуйста, смотрите здесь полное пошаговое руководство по созданию надгробий. В обучающем наборе есть класс IsolatedStorageHelper, который вы могли бы использовать. Он использует сериализатор / десериализатор Json и должен работать с большинством классов со свойствами стандартного типа. В Codeplex здесь также есть помощник Tombstone, который может вам подойти.

Надеюсь, это поможет!

Комментарии:

1. Почему бы не использовать «PhoneApplicationService. Текущий. Указать «вместо IsoStorage?

2. @vidalsasoon .. Я думаю, вы могли бы. Но для вас это просто состояние сохранения операционной системы, верно? Лично я всегда использовал необходимые события для самостоятельного управления постоянным состоянием в изолированном хранилище.