GetNavigationState не поддерживает сериализацию типа параметра, который был передан в Frame.Navigate

1

Я использую WinRT и Prism для Surface App. получая это исключение во время приостановки. GetNavigationState не поддерживает сериализацию типа параметра, который был передан в Frame.Navigate Изображение 174551

Теги:
xaml
windows-store-apps
windows-runtime

3 ответа

2

Вероятно, вы передаете сложный тип в Navigate() где-то, и это не может быть сериализовано.

Как ответил Луис Кантеро здесь:

Чтобы включить сериализацию состояния кадра с помощью GetNavigationState, вы должны передать только базовые типы для этого метода, такие как строковые, char, числовые и GUID-типы. Если вы передаете объект в качестве параметра, запись в стеке навигации фрейма содержит ссылку на объект до тех пор, пока кадр не будет выпущен или эта запись не будет выпущена при новой навигации, которая будет расходиться со стеком. В общем, мы препятствуем передаче не-базового типа в качестве параметра для навигации, потому что он не может быть сериализован, когда приложение приостановлено, и может потреблять больше памяти, потому что ссылка хранится в стеке кадров, чтобы приложение могло идти вперед и назад.

Также см. Исключение при вызове SuspensionManager.SaveAsync()

и http://www.damirscorner.com/UsingSuspensionManagerForSavingApplicationState.aspx

0

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

При посадке на страницу:

Private Sub NavigationHelper_LoadState(sender As Object, e As Common.LoadStateEventArgs)
    Dim NavParameter As Object = GetPageNavigationParameterFromString(e.NavigationParameter)
    If TypeOf (NavParameter) Is MyObjectToTransfer Then
        _transferedObject = CType(NavParameter, MyObjectToTransfer)
    End If
End Sub

При переходе на страницу:

Frame.Navigate(GetType(MyCurrentPage), GetPageNavigationParameterFromObject(New MyObjectToTransfer(arg1, arg2 etc...)))

Используя эти функции:

Public Shared Function GetPageNavigationParameterFromObject(stateObject As Object) As String
        If stateObject Is Nothing Then Return String.Empty
        ... your code to serialize your object as a string
End Function

Public Shared Function GetPageNavigationParameterFromString(stateString As String) As Object
        If stateString Is Nothing Then Return Nothing
        ... your code to deserialize your string to an object
End Function

Хорошо работает для любого типа объекта, если вы можете сериализовать/десериализовать его, например, с помощью Json.

Удачи!

0

Prism говорит о вашем сценарии именно в своей вики.

Эта суть:

  1. Не делай этого. Используйте простой тип.
  2. Если вы должны это сделать, и альтернативы нет, сериализуйте объект в строку и передайте это. Отсоедините на следующей странице.

На странице wiki есть намного больше информации, поэтому, пожалуйста, смотрите там.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню