3

我遇到了一个问题,我的应用程序的某个页面无法从墓碑恢复。尝试访问该应用程序只会导致返回主屏幕。

在调试过程中,控制台记录了三行:

  • 类型的第一次机会异常System.Runtime.Serialization.InvalidDataContractException发生在System.Runtime.Serialization.dll
  • 类型的第一次机会异常System.Reflection.TargetInvocationException发生在mscorlib.dll
  • 类型的第一次机会异常System.Runtime.Serialization.InvalidDataContractException发生在System.Runtime.Serialization.dll

然后,我检查e.ExceptionObject.Message.ToString()并看到了这个错误:

"Type 'Newtonsoft.Json.Linq.JToken' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute."

我在该页面的cs代码中使用了一些JObjectsJTokens。我特别将列表框中的绑定值设置为这些值JObjects

<ListBox x:Name="list" Height="600" HorizontalContentAlignment="Stretch">
    <!--SelectionChanged="list_SelectionChanged"-->
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding hline}" FontSize="{StaticResource PhoneFontSizeMedium}" TextWrapping="Wrap" Width="474" />
                <TextBlock Text="{Binding body}" Margin="0,0,0,36"  FontSize="{StaticResource PhoneFontSizeNormal}" TextWrapping="Wrap" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

然后在代码中:

var deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Mydata>>(messagearray.ToString().Replace("<br/>", "\n"));

list.ItemsSource = deserialized;

对于墓碑,我只是这样做:

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    this.SaveState(e);  // <- first line
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    this.RestoreState();  // <- second line
}

为了能够墓碑和生存,我应该做些不同的事情吗?

4

1 回答 1

0

TombstoneHelper 直接使用 Page State 对象,然后使用内置的序列化程序来序列化事物。您页面中的某些内容使用了默认序列化程序 (DataContractSerializer) 无法处理的 JToken。

由于看起来您正在使用 MVVM,我建议您直接自己管理视图模型的序列化和存储,然后在 OnNavigatedTo 方法中重新水化视图模型。

完整的复制将有助于更完整的解决方案。

于 2012-11-06T09:55:45.110 回答