.NET Core5迁移至6后Newtonsoft.Json反序列化Tuple报错如何解决?
.NET Core 5迁移至6时Newtonsoft.Json序列化Tuple的发布环境问题及解决方案
问题背景
项目从.NET Core 5迁移到.NET Core 6后,后端使用Newtonsoft.Json序列化Tuple<MainConfiguration, SecondaryConfiguration>对象,前端进行反序列化时出现异常:开发环境运行正常,但发布后浏览器控制台抛出序列化异常。
原序列化代码
var content = new Tuple<MainConfiguration, SecondaryConfiguration>(mainConfiguration, secondaryConfiguration); var serializedContent = JsonConvert.SerializeObject(content);
原反序列化代码
var data = JsonConvert.DeserializeObject<Tuple<MainConfiguration, SecondaryConfiguration>>(serializedContent ?? string.Empty);
报错信息
发布后浏览器控制台输出如下异常:
ThreadPool Callback threw an unhandled exception of type Newtonsoft.Json.JsonSerializationException window.Module.s.printErr @ blazor.webassembly.js:1
问题排查
经定位,异常根源在于前端对.NET原生Tuple对象的反序列化,后端序列化过程无异常。
解决方案
使用自定义类替代.NET原生Tuple对象,具体实现如下:
自定义Tuple替代类
public class ConfigurationTuple { public ConfigurationTuple() { } public ConfigurationTuple(MainConfiguration item1, SecondaryConfiguration item2) { Item1 = item1; Item2 = item2; } public MainConfiguration Item1 { get; set; } public SecondaryConfiguration Item2 { get; set; } }
替换后的序列化代码
var content = new ConfigurationTuple(mainConfiguration, secondaryConfiguration); var serializedContent = JsonConvert.SerializeObject(content);
替换后的反序列化代码
var data = JsonConvert.DeserializeObject<ConfigurationTuple>(serializedContent ?? string.Empty);
总结
在.NET Core 5迁移至6的场景下,使用Newtonsoft.Json进行前后端序列化交互时,应避免使用.NET原生Tuple对象,改用自定义类替代,问题核心出在前端反序列化环节。
内容的提问来源于stack exchange,提问作者Eazael
相关产品推荐
相关产品推荐

