C#中JsonConvert.DeserializeObject反序列化System.Memory<double>异常的解决方法
解决System.Memory的Newtonsoft.Json反序列化问题
因为Newtonsoft.Json没有内置处理System.Memory<T>的逻辑,默认会把它当作普通对象解析,但你的JSON是数组格式,所以需要自定义Json转换器来实现数组和Memory<double>的互转,不需要修改类的属性类型。
实现自定义Json转换器
创建一个继承自JsonConverter<Memory<double>>的转换器,负责处理序列化和反序列化逻辑:
public class MemoryDoubleConverter : JsonConverter<Memory<double>> { public override Memory<double> ReadJson(JsonReader reader, Type objectType, Memory<double> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 将JSON数组反序列化为double数组,再包装成Memory<double> var array = serializer.Deserialize<double[]>(reader); return array != null ? array.AsMemory() : Memory<double>.Empty; } public override void WriteJson(JsonWriter writer, Memory<double> value, JsonSerializer serializer) { // 将Memory<double>转换为数组后序列化 serializer.Serialize(writer, value.ToArray()); } }
应用转换器到目标属性
在你的CLASS1的PROP1属性上标记[JsonConverter]特性,指定使用上面的转换器:
public class CLASS1 { [JsonConverter(typeof(MemoryDoubleConverter))] public Memory<double> PROP1 { get; set; } }
执行反序列化
现在直接使用原来的反序列化代码即可正常工作:
var result = JsonConvert.DeserializeObject<CLASS1>(File.ReadAllText(fileName));
替代方案:全局注册转换器
如果不想给每个属性加特性,也可以在反序列化时全局注册转换器:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new MemoryDoubleConverter()); var result = JsonConvert.DeserializeObject<CLASS1>(File.ReadAllText(fileName), settings);
原理说明
Memory<double>本质是对底层数组的引用(包含偏移量和长度信息),JSON中的数组是完整的元素集合,转换器先把JSON数组解析为普通double[],再通过AsMemory()将其包装为Memory<double>,完美匹配你的序列化/反序列化需求。
内容的提问来源于stack exchange,提问作者c_ph_r
相关产品推荐
相关产品推荐

