Я использую WinRT и Prism для Surface App. получая это исключение во время приостановки. GetNavigationState не поддерживает сериализацию типа параметра, который был передан в Frame.Navigate
Вероятно, вы передаете сложный тип в Navigate() где-то, и это не может быть сериализовано.
Как ответил Луис Кантеро здесь:
Чтобы включить сериализацию состояния кадра с помощью GetNavigationState, вы должны передать только базовые типы для этого метода, такие как строковые, char, числовые и GUID-типы. Если вы передаете объект в качестве параметра, запись в стеке навигации фрейма содержит ссылку на объект до тех пор, пока кадр не будет выпущен или эта запись не будет выпущена при новой навигации, которая будет расходиться со стеком. В общем, мы препятствуем передаче не-базового типа в качестве параметра для навигации, потому что он не может быть сериализован, когда приложение приостановлено, и может потреблять больше памяти, потому что ссылка хранится в стеке кадров, чтобы приложение могло идти вперед и назад.
Также см. Исключение при вызове SuspensionManager.SaveAsync()
и http://www.damirscorner.com/UsingSuspensionManagerForSavingApplicationState.aspx
Я недавно столкнулся с этой проблемой сам. Действительно, простые типы работают хорошо, но не сложные типы. Чтобы обойти эту проблему с тех пор, я всегда сериализую и десериализую свои объекты перед переходом на новую страницу и десериализую свои объекты при посадке на эту новую страницу. Вот простой код для этого:
При посадке на страницу:
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.
Удачи!
Prism говорит о вашем сценарии именно в своей вики.
Эта суть:
На странице wiki есть намного больше информации, поэтому, пожалуйста, смотрите там.