Чтобы сериализовать словарь с помощью NodaTime.Instance для json с помощью json.net работает отлично, но при десериализации он выдает Newtonsoft.Json. JsonSerializationException. Приведенный ниже тест показывает проблему:
[Test]
public void DeserializeDictionaryThowsException() {
JsonConverter[] converters = { NodaConverters.IntervalConverter, NodaConverters.InstantConverter };
var dictionary = new Dictionary<Instant, int>() {
{Instant.FromUtc(2012, 1, 2, 3, 4, 5), 0}
};
var json = JsonConvert.SerializeObject(dictionary, Formatting.None, converters);
Assert.AreEqual("{\"2012-01-02T03:04:05Z\":0}", json); //ok
var result = JsonConvert.DeserializeObject<Dictionary<Instant, int>>(json, converters); // throws
}
DeserializeObject throws:
Newtonsoft.Json.JsonSerializationException: Не удалось преобразовать строку '2012-01-02T03: 04: 05Z' в словарь типа ключа "NodaTime.Instant". Создайте TypeConverter для преобразования из строки в объект типа ключа. Строка 1, позиция 24. ---- > Newtonsoft.Json.JsonSerializationException: Ошибка преобразования значения "2012-01-02T03: 04: 05Z" для ввода "NodaTime.Instant". Строка 1, позиция 24. ---- > System.Exception: не удалось выполнить преобразование из System.String в NodaTime.Instant.
В качестве побочной заметки десериализация словаря DateTime отлично работает. Думаю, потому что у String есть конвертер для DateTime.
[Test]
public void DeserializeDiciotnaryOfDateTime() // OK
{
var expected = new DateTime(2012, 1, 2, 3, 4, 5, DateTimeKind.Utc);
var dictionary = new Dictionary<DateTime, int>() { { expected, 0 } };
var json = JsonConvert.SerializeObject(dictionary);
var result = JsonConvert.DeserializeObject<Dictionary<DateTime, int>>(json);
Assert.AreEqual(expected, dictionary.Keys.First()); // OK
}