Сериализация и десериализация System.Version с использованием Newtonsoft, do tnet core 2.2 против dot net core 3.1 - PullRequest
0 голосов
/ 08 января 2020

Нам нужно перейти с do tnet core 2.2 на do tnet core 3.1. У нас есть объект, который имеет свойство класса System.Version. Мы не использовали VersionConverter при сериализации и десериализации с do tnet core 2.2. Таким образом, сериализованный объект с точкой net core 2.2 имел сериализованную версию вывода в виде {"Major":2,"Minor":0,"Build":20,"Revision":0,"MajorRevision":0,"MinorRevision":0} без использования VersionConverter.

С do tnet core 3.1 по умолчанию для сериализации (Без использования VersionConverter) равно 2.0.20.0

У нас есть определенные метаданные, уже сохраненные в прежнем формате, и другие компоненты системы также полагаются на это. Есть ли способ продолжить работу с прежним форматом для сериализации и десериализации (с использованием newtonsoft) с новой версией do tnet core 3.1? В настоящее время мы хотим сделать компоненты всей системы обратно совместимыми, а затем включить их в сериализацию и десериализацию с помощью VersionConverter.

1 Ответ

0 голосов
/ 01 апреля 2020

У нас было то же исключение десериализации для типов System.Version при обновлении с. NET Core 2.1 до 3.1.

Мы создали конвертер:

public class VersionConverter : JsonConverter<Version>
{
    public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer)
    {
    }

    public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var dict = serializer.Deserialize<Dictionary<string, int>>(reader);
        var version = new Version(dict["Major"], dict["Minor"], dict["Build"], dict["Revision"]);

        return version;
    }

    public override bool CanWrite => false;
}

Затем мы используйте преобразователь для десериализации:

var result = JsonConvert.DeserializeObject<SomeTypeWithVersionProperty>(serializedValue, new VersionConverter());
...