You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:35:11