自定义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
相关产品推荐
相关产品推荐

