Ошибка «Newtonsoft.Json.Linq.JToken» не может быть сериализована с помощью TombstoneHelper

Я столкнулся с проблемой, когда определенная страница моего приложения не восстанавливалась после захоронения. Попытка получить доступ к приложению просто приведет к тому, что вы вернетесь на главный экран.

Во время отладки в консоль были выведены три строки:

  • Первое случайное исключение типа 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."

Я использую некоторые JObjects и JTokens в коде cs для этой страницы. В частности, я устанавливаю значения привязки в списке на значения из этих 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
}

Есть ли что-то, что я должен делать по-другому, чтобы быть в состоянии надгробие и выжить?


person Luke G.    schedule 05.11.2012    source источник


Ответы (1)


TombstoneHelper напрямую использует объект состояния страницы, а тот, в свою очередь, использует встроенный сериализатор для сериализации вещей. Что-то на вашей странице использует JToken, который сериализатор по умолчанию (DataContractSerializer) не может обработать.

Поскольку похоже, что вы используете MVVM, я бы посоветовал вам самостоятельно управлять сериализацией и хранением модели представления, а затем в методе OnNavigatedTo регидратировать модель представления.

Полное воспроизведение помогло бы с более полным решением.

person Matt Lacey    schedule 06.11.2012
comment
Итак, похоже, мне действительно не следует использовать TombstoneHelper на этой странице. Я не смог найти ничего в документации, чтобы сказать TH игнорировать определенный элемент, чтобы я мог обрабатывать его по-другому... - person Luke G.; 06.11.2012
comment
нм... я не умею читать. :) Похоже, я могу указать TH сохранять определенные типы объектов. Итак, я заставлю его сохранить все, кроме моего списка, и я посмотрю, что я могу сделать, чтобы сериализовать это и справиться с этим самостоятельно. - person Luke G.; 06.11.2012
comment
Итак, я использовал JSON.net для сериализации используемых объектов, а затем сохранял их в изолированном хранилище. В любом случае, это оказалось намного менее запутанным методом доступа к этим данным. Итак, ошибок больше нет, и все вроде бы корректно заживает и восстанавливается! Спасибо за помощь! - person Luke G.; 06.11.2012