GetNavigationState不支持传递给Frame.Navigate的参数types的序列化

我正在使用WinRT和棱镜的表面应用程序。 在暂停时获取此exception。GetNavigationState不支持传递给Frame.Navigate的参数types的序列化 在这里输入图像说明

    它可能是你传递一个复杂的类型到Navigate()的地方,而不能键入序列化。

    正如Luis Cantero 在这里回答的那样:

    要使用GetNavigationState启用框架状态的序列化,您只能将基本类型传递给此方法,如字符串,字符型,数字型和GUID类型。 如果将对象作为参数传递,则框架导航堆栈中的条目将保留对象的引用,直到框架被释放,或者该条目在从堆栈分叉的新导航时释放。 一般来说,我们不鼓励将非基本类型作为参数传递给Navigate,因为当应用程序被挂起时,它不能被序列化,并且可以消耗更多的内存,因为引用被框架的导航堆栈保存以允许应用程序去向前和向后。

    调用SuspensionManager.SaveAsync()时,请参阅异常

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

    棱镜专门在他们的wiki中谈论你的情况。

    它的这个要点:

    1. 不要这样做。 使用一个简单的类型。
    2. 如果你必须这样做,没有其他选择,将对象序列化为一个字符串,并将其传递。 在下一页反序列化。

    维基页面上有更多的信息,请看这里。

    我最近自己也遇到过这个问题。 事实上简单的类型工作得很好,但不是复杂的类型 为了解决此问题,我总是在导航到新页面之前序列化和反序列化对象,并在新页面上着陆时反序列化我的对象。 这是一个简单的代码来实现这一点:

    登陆一个页面时:

    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序列化/反序列化它,任何对象类型都能正常工作。

    祝你好运!