c# - 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
.
解决方案
从 .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());
推荐阅读
- sql - 按国家/地区统计 3 个不同的值 + 加入
- django-models - 如何使用选择字段值过滤对象:Django
- python - Pythonista 中 Node.remove_action 的属性用途是什么?
- scala - 如何为按名称传递函数参数的参数创建临时别名?
- windows - 如何为每个生产 PC 客户端更新便携式软件
- postgresql - go,gorm - 如何将 jsonb 和 json[] 插入 postgresql
- javascript - Webpack React - 组件问题
- swiftui - 将关闭键盘添加到 ZStack 时,SwiftUI 选择器停止工作
- java - apache NiFi 1.13.2 ListenWebsocket 不工作
- javascript - 从去抖动函数返回一个值