首页 > 解决方案 > System.Version的序列化和反序列化使用Newtonsoft,dotnet core 2.2 vs dot net core 3.1

问题描述

我们需要从 dotnet core 2.2 迁移到 dotnet core 3.1。我们有一个具有类 System.Version 属性的对象。在使用 dotnet core 2.2 进行序列化和反序列化时,我们没有使用 VersionConverter。所以dot net core 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.

标签: c#.net-corejson.net

解决方案


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

推荐阅读