【问题标题】:Serialization and Deserialization of System.Version using Newtonsoft, dotnet core 2.2 vs dot net core 3.1System.Version的序列化和反序列化使用Newtonsoft,dotnet core 2.2 vs dot net core 3.1
【发布时间】:2020-01-08 14:31:48
【问题描述】:

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

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

我们已经以以前的格式存储了某些元数据,系统的其他组件也依赖它。有没有办法使用新的 dotnet 核心版本 3.1 继续使用以前的序列化和反序列化格式(使用 newtonsoft)?目前我们想让整个系统的组件向后兼容,然后通过VersionConverter进行序列化和反序列化。

【问题讨论】:

  • 我们还是想用Newtonsoft.Json进行序列化和反序列化
  • 那里的主要答案包括如何取回它。
  • 我们正在使用 JsonConvert.SerializeObject(version)。这在旧版本和最新版本中都可以访问。此序列化为 .NET core 2.2 和 .NET core 3.1 2.2:{"Major":2,"Minor":0,"Build":20,"Revision":0,"MajorRevision":0,"MinorRevision":0} 3.1:2.0.20.0 提供不同的输出
  • 必须在您的全局配置中注册一个转换器。你不应该依赖这种全局行为。

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


【解决方案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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2021-12-03
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多