Я работаю над приложением Xamarin.Forms, в котором мне нужно кэшировать данные, когда нет подключения к Интернету. В настоящее время я использую встроенный механизм персистентности Application.Current.Properties
для сохранения данных, который работает просто отлично. Однако для более сложного объекта я не могу десериализовать.
У меня есть следующий объект Модель:
public class SPL
{
public SPL(Point point, Location location)
{
Point = point;
Location = location;
}
public Location Location { get; set; }
public Point Point { get; set; }
}
Где Location
имеет два свойства типа double
и Point
имеет два свойства типа DateTime
и типа double
соответственно.
Во время выполнения приложения я постоянно сохраняю данные в локальном кеше, например, всякий раз, когда нет подключения к Интернету
SPL spl = new SPL(point, location);
SPLValues.Add(spl);
var serializedSpl = JsonConvert.SerializeObject(SPLValues);
Application.Current.Properties["splvalues"] = serializedSpl;
Прерывание последней строки и проверка с помощью отладчика показывает, что данные сохранены .
Когда приложение засыпает, я звоню Current.SavePropertiesAsync();
. После возобновления работы приложения я пытаюсь десериализовать локальный кеш, например
public List<T> GetCache<T>(string key) where T : class
{
IDictionary<string, object> properties = Application.Current.Properties;
if (properties.ContainsKey(key))
{
var data = JsonConvert.DeserializeObject<List<T>>(key); // Fails here
return data;
}
return new List<T>();
}
Что не получается. Исключение составляет
Необработанное исключение: Newtonsoft.Json.JsonReaderException: неожиданный символ, обнаруженный при разборе значения: s. Путь '', строка 0, позиция 0. произошло
UPDATE
Как указал JOSEFtw, в моем вызове десериализации отсутствовал параметр, поэтому теперь он выглядит следующим образом: var data = JsonConvert.DeserializeObject<List<T>>(properties[key]);
После исправления я теперь сталкиваюсь с этой ошибкой:
Необработанное исключение: Newtonsoft.Json.JsonSerializationException: Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1 [CacheDemo.Models.SPL]' потому что для корректной десериализации тип требует массив JSON (например, [1,2,3]).
Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы это был нормальный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например, массив или список), которые можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON.
Путь «Местоположение», строка 1, позиция 12. произошло
Что я делаю не так?