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

自定义JsonConverter跳过内部对象仅序列化基础属性触发内存溢出问题

仅序列化类指定基础属性的解决方案

原代码问题分析

你写的CanConvert逻辑完全错误:

  • A是类(class),所以!isClass为false,导致转换器永远不会被触发,自然无法生效。
  • 错误的转换器逻辑加上可能的循环引用(比如Role类和A类互相引用),在序列化大量对象时容易引发OutOfMemory Exception。

方案一:匿名类投影(最简单直接)

不需要自定义转换器,序列化时直接将A对象投影为仅包含目标属性的匿名类,从根源避免序列化多余属性:

// 假设aList是你的A对象列表
var json = JsonConvert.SerializeObject(
    aList.Select(a => new 
    { 
        a.name, 
        a.surname, 
        a.roleCode 
    })
);

这种方式代码简洁,性能高,还能避免循环引用和内存溢出问题。


方案二:正确实现自定义JsonConverter

如果必须用转换器,需要修正CanConvert逻辑,并在WriteJson中手动控制序列化的属性:

public class AJsonConverter : JsonConverter<A>
{
    public override void WriteJson(JsonWriter writer, A value, JsonSerializer serializer)
    {
        var jsonObj = new JObject();
        // 只添加需要的属性
        jsonObj.Add("name", value.name);
        jsonObj.Add("surname", value.surname);
        jsonObj.Add("roleCode", value.roleCode);
        jsonObj.WriteTo(writer);
    }

    public override A ReadJson(JsonReader reader, Type objectType, A existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 若不需要反序列化,直接抛出异常或返回默认值
        throw new NotImplementedException("反序列化未实现");
    }

    public override bool CanConvert(Type objectType)
    {
        // 仅对A类生效
        return objectType == typeof(A);
    }
}

使用时在序列化方法中传入转换器:

var json = JsonConvert.SerializeObject(aList, new AJsonConverter());

内容的提问来源于stack exchange,提问作者Luca Nitti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:46