База данных NodaTime json сериализация - PullRequest
1 голос
/ 30 марта 2020

Я сохраняю список расписаний в столбце jsonb в базе данных postgres, и у меня возникают проблемы с типом LocalDate NodaTime.

Вот мой объект, который сериализуется (на самом деле List<Schedule> сериализуется и сохраняется в базе данных)

public class Schedule
{
    public LocalTime? Start { get; set; }
    public LocalTime? End { get; set; }
}

Это то, что хранится в базе данных

[
    {
        "End": {
            "Hour": 10,
            "Minute": 0,
            "Second": 0,
            "TickOfDay": 360000000000,
            "Millisecond": 0,
            "TickOfSecond": 0,
            "NanosecondOfDay": 36000000000000,
            "ClockHourOfHalfDay": 10,
            "NanosecondOfSecond": 0
        },
        "Start": {
            "Hour": 8,
            "Minute": 0,
            "Second": 0,
            "TickOfDay": 288000000000,
            "Millisecond": 0,
            "TickOfSecond": 0,
            "NanosecondOfDay": 28800000000000,
            "ClockHourOfHalfDay": 8,
            "NanosecondOfSecond": 0
        }
    }
]

Мне это кажется вполне подходящим, но проблема в том, что когда я выбираю данные из базы данных, мои LocalDate имеют значение '00: 00: 00 '.

Сериализация / десериализация выполняется с использованием

var converter = new ValueConverter<T, string>
(
    v => JsonConvert.SerializeObject(v),
    v => JsonConvert.DeserializeObject<T>(v) ?? null
);

1 Ответ

1 голос
/ 30 марта 2020

Я добавил NodaTime.Serialization.JsonNet, как предложено в комментариях, и изменил конвертер для Entity Framework на:

var converter = new ValueConverter<T, string>
(
    v => JsonConvert.SerializeObject(v, NodaConverters.LocalTimeConverter),
    v => JsonConvert.DeserializeObject<T>(v, NodaConverters.LocalTimeConverter) ?? null
);

Теперь он корректно сериализуется в строку и успешно десериализуется.

[{"End": "10:00:00", "Start": "09:00:00"}]
...