【问题标题】:GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.NavigateGetNavigationState 不支持传递给 Frame.Navigate 的参数类型的序列化
【发布时间】:2014-05-27 18:28:08
【问题描述】:

我正在为 Surface 应用程序使用 WinRT 和 Prism。在暂停时出现此异常。GetNavigationState 不支持对传递给 Frame.Navigate 的参数类型进行序列化

【问题讨论】:

    标签: c# windows xaml windows-runtime windows-store-apps


    【解决方案1】:

    您很可能在某处将复杂类型传递给 Navigate(),而该类型无法序列化。

    由 Luis Cantero here 回答:

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

    另见Exception when calling SuspensionManager.SaveAsync()

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

    【讨论】:

      【解决方案2】:

      Prism talks about your scenario specifically in their wiki.

      它的要点:

      1. 不要这样做。使用简单类型。
      2. 如果您必须这样做并且别无选择,请将对象序列化为字符串并传递。在下一页反序列化。

      wiki 页面上有更多信息,请查看那里。

      【讨论】:

        【解决方案3】:

        我最近自己也遇到了这个问题。确实,简单类型工作得很好,但复杂类型却不行。 从那时起,为了解决这个问题,我总是在导航到新页面之前序列化和反序列化我的对象,并在登陆新页面时反序列化我的对象。 这是实现此目的的简单代码:

        登陆页面时:

        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。

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-28
          • 2019-10-07
          • 2014-06-30
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          相关资源
          最近更新 更多