使用Newtonsoft,dotnet核心2.2和dotnet核心3.1对System.Version进行序列化和反序列化

时间:2020-01-08 14:31:48

标签: c# .net-core json.net

我们需要从dotnet core 2.2迁移到dotnet core 3.1。我们有一个对象,它具有类System.Version的属性。在使用dotnet core 2.2进行序列化和反序列化时,我们没有使用VersionConverter。因此,具有点网核心2.2的序列化对象以{"Major":2,"Minor":0,"Build":20,"Revision":0,"MajorRevision":0,"MinorRevision":0}的形式序列化了版本输出,而没有使用VersionConverter

对于dotnet core 3.1,默认序列化(不使用VersionConverter)为 2.0.20.0

我们已经以以前的格式存储了某些元数据,并且系统的其他组件也依赖它。是否有办法继续使用新的dotnet核心版本3.1进行序列化和反序列化(使用newtonsoft)的前一种格式?当前,我们希望使系统中的组件向后兼容,然后使用VersionConverter进行序列化和反序列化。

1 个答案:

答案 0 :(得分:1)

从.NET Core 2.1升级到3.1时,System.Version类型具有相同的反序列化异常。

我们创建了一个转换器:

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());