C# JSON对象不会序列化大数据
我正在尝试用JSON序列化数据。但我面临以下例外 用户代码未处理OutOfMemoryException。C# JSON对象不会序列化大数据,c#,angularjs,json,asp.net-mvc,serialization,C#,Angularjs,Json,Asp.net Mvc,Serialization,我正在尝试用JSON序列化数据。但我面临以下例外 用户代码未处理OutOfMemoryException。 Newtonsoft.Json.dll中发生“System.OutOfMemoryException”类型的异常,但未在用户代码中处理 下面我定义了我的代码: 主控制器: public class TrackingController : BaseAngularController { var lstDetails = _services.GetTrackingDetailsByA
Newtonsoft.Json.dll中发生“System.OutOfMemoryException”类型的异常,但未在用户代码中处理 下面我定义了我的代码: 主控制器:
public class TrackingController : BaseAngularController
{
var lstDetails = _services.GetTrackingDetailsByAWBIds(awbids, awbType);
if (lstDetails != null)
{
return AngularJson(lstDetails);
}
}
public abstract class BaseAngularController : Controller
{
public AngularJsonResult<T> AngularJson<T>(T model)
{
return new AngularJsonResult<T>() { Data = model };
}
}
public class AngularJsonResult<T> :AngularJsonResult
{
public new T Data
{
get { return (T)base.Data; }
set { base.Data = value; }
}
}
public class AngularJsonResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
DoUninterestingBaseClassStuff(context);
SerializeData(context.HttpContext.Response);
}
private void DoUninterestingBaseClassStuff(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
}
protected virtual void SerializeData(HttpResponseBase response)
{
if (ErrorMessages.Any())
{
Data = new
{
ErrorMessage = string.Join("\n", ErrorMessages),
ErrorMessages = ErrorMessages.ToArray()
};
response.StatusCode = 400;
}
if (Data == null) return;
response.Write(Data.ToJson());
}
}
public static class JsonExtensions
{
public static string ToJson<T>(this T obj, bool includeNull = true)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new JsonConverter[] { new StringEnumConverter() },
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,//newly added
//PreserveReferencesHandling =Newtonsoft.Json.PreserveReferencesHandling.Objects,
NullValueHandling = includeNull ? NullValueHandling.Include : NullValueHandling.Ignore
};
return JsonConvert.SerializeObject(obj, settings);
}
}
基本控制器:
public class TrackingController : BaseAngularController
{
var lstDetails = _services.GetTrackingDetailsByAWBIds(awbids, awbType);
if (lstDetails != null)
{
return AngularJson(lstDetails);
}
}
public abstract class BaseAngularController : Controller
{
public AngularJsonResult<T> AngularJson<T>(T model)
{
return new AngularJsonResult<T>() { Data = model };
}
}
public class AngularJsonResult<T> :AngularJsonResult
{
public new T Data
{
get { return (T)base.Data; }
set { base.Data = value; }
}
}
public class AngularJsonResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
DoUninterestingBaseClassStuff(context);
SerializeData(context.HttpContext.Response);
}
private void DoUninterestingBaseClassStuff(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
}
protected virtual void SerializeData(HttpResponseBase response)
{
if (ErrorMessages.Any())
{
Data = new
{
ErrorMessage = string.Join("\n", ErrorMessages),
ErrorMessages = ErrorMessages.ToArray()
};
response.StatusCode = 400;
}
if (Data == null) return;
response.Write(Data.ToJson());
}
}
public static class JsonExtensions
{
public static string ToJson<T>(this T obj, bool includeNull = true)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new JsonConverter[] { new StringEnumConverter() },
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,//newly added
//PreserveReferencesHandling =Newtonsoft.Json.PreserveReferencesHandling.Objects,
NullValueHandling = includeNull ? NullValueHandling.Include : NullValueHandling.Ignore
};
return JsonConvert.SerializeObject(obj, settings);
}
}
将对象序列化为JSON:
public class TrackingController : BaseAngularController
{
var lstDetails = _services.GetTrackingDetailsByAWBIds(awbids, awbType);
if (lstDetails != null)
{
return AngularJson(lstDetails);
}
}
public abstract class BaseAngularController : Controller
{
public AngularJsonResult<T> AngularJson<T>(T model)
{
return new AngularJsonResult<T>() { Data = model };
}
}
public class AngularJsonResult<T> :AngularJsonResult
{
public new T Data
{
get { return (T)base.Data; }
set { base.Data = value; }
}
}
public class AngularJsonResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
DoUninterestingBaseClassStuff(context);
SerializeData(context.HttpContext.Response);
}
private void DoUninterestingBaseClassStuff(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
var response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
}
protected virtual void SerializeData(HttpResponseBase response)
{
if (ErrorMessages.Any())
{
Data = new
{
ErrorMessage = string.Join("\n", ErrorMessages),
ErrorMessages = ErrorMessages.ToArray()
};
response.StatusCode = 400;
}
if (Data == null) return;
response.Write(Data.ToJson());
}
}
public static class JsonExtensions
{
public static string ToJson<T>(this T obj, bool includeNull = true)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new JsonConverter[] { new StringEnumConverter() },
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,//newly added
//PreserveReferencesHandling =Newtonsoft.Json.PreserveReferencesHandling.Objects,
NullValueHandling = includeNull ? NullValueHandling.Include : NullValueHandling.Ignore
};
return JsonConvert.SerializeObject(obj, settings);
}
}
公共静态类JsonExtensions
{
公共静态字符串ToJson(此T obj,bool includeNull=true)
{
var设置=新的JsonSerializerSettings
{
ContractResolver=新的CamelCasePropertyNamesContractResolver(),
Converters=new JsonConverter[]{new StringEnumConverter()},
ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore,//新添加
//PreserveReferencesHandling=Newtonsoft.Json.PreserveReferencesHandling.Objects,
NullValueHandling=includeNull?NullValueHandling.Include:NullValueHandling.Ignore
};
返回JsonConvert.SerializeObject(对象,设置);
}
}
在这里,我定义了用于传递对象的AngularJson
方法,并覆盖了用于将对象转换为JSON的ExecuteResult
方法
因此,我的SerializeData
方法传递Response
并转换为JSON中的Objet,如Data.ToJson()
请告诉我您的建议。您的问题是,您正在将大量数据序列化为服务器内存中的一个字符串,然后将整个字符串写入
HttpResponseBase
(默认情况下,该数据库也会缓冲所有内容),并且在进程中的某个位置内存不足,可能会超过默认值
减少内存使用的一种方法是直接序列化为using。这避免了中间字符串表示
您可能还需要设置,如果是这样,请遵循中给出的建议,并将输出流包装在缓冲流
中
以下扩展方法可用于此操作:
public static class HttpResponseBaseExtensions
{
public static void WriteJson<T>(this HttpResponseBase response, T obj, bool useResponseBuffering = true, bool includeNull = true)
{
var contentEncoding = response.ContentEncoding ?? Encoding.UTF8;
if (!useResponseBuffering)
{
response.Buffer = false;
// use a BufferedStream as suggested in //https://stackoverflow.com/questions/26010915/unbuffered-output-very-slow
var bufferedStream = new BufferedStream(response.OutputStream, 256 * 1024);
bufferedStream.WriteJson(obj, contentEncoding, includeNull);
bufferedStream.Flush();
}
else
{
response.OutputStream.WriteJson(obj, contentEncoding, includeNull);
}
}
static void WriteJson<T>(this Stream stream, T obj, Encoding contentEncoding, bool includeNull)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new JsonConverter[] { new StringEnumConverter() },
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,//newly added
//PreserveReferencesHandling =Newtonsoft.Json.PreserveReferencesHandling.Objects,
NullValueHandling = includeNull ? NullValueHandling.Include : NullValueHandling.Ignore
};
var serializer = JsonSerializer.CreateDefault(settings);
var textWriter = new StreamWriter(stream, contentEncoding);
serializer.Serialize(textWriter, obj);
textWriter.Flush();
}
}
公共静态类HttpResponseBaseExtensions
{
public static void WriteJson(此HttpResponseBase响应,T obj,bool userresponsebuffering=true,bool includeNull=true)
{
var contentEncoding=response.contentEncoding??Encoding.UTF8;
如果(!useResponseBuffering)
{
response.Buffer=false;
//使用中建议的BufferedStream//https://stackoverflow.com/questions/26010915/unbuffered-output-very-slow
var bufferedStream=新的bufferedStream(response.OutputStream,256*1024);
WriteJson(obj,contentEncoding,includeNull);
bufferedStream.Flush();
}
其他的
{
response.OutputStream.WriteJson(obj,contentEncoding,includeNull);
}
}
静态void WriteJson(此流,T obj,Encoding contentEncoding,bool includeNull)
{
var设置=新的JsonSerializerSettings
{
ContractResolver=新的CamelCasePropertyNamesContractResolver(),
Converters=new JsonConverter[]{new StringEnumConverter()},
ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore,//新添加
//PreserveReferencesHandling=Newtonsoft.Json.PreserveReferencesHandling.Objects,
NullValueHandling=includeNull?NullValueHandling.Include:NullValueHandling.Ignore
};
var serializer=JsonSerializer.CreateDefault(设置);
var textWriter=新的StreamWriter(流、内容编码);
serializer.Serialize(textWriter,obj);
textWriter.Flush();
}
}
然后使用扩展方法代替
response.Write(Data.ToJson())代码>此代码是部署在测试服务器上,还是通过IDE进行测试?您正在使用什么IDE?是的,这段代码部署在测试服务器上。所以这可能是JVM内存问题-听起来您没有分配足够的内存来处理您试图序列化的内容。数据有多大?如何分配内存。。。我无法找到数据的大小。。。它由7个以上的数据库表组合而成。如果这是一个托管服务器(内部),您应该与IT帮助台联系,并与他们讨论您正在使用的服务容器。你在用Tomcat吗?玻璃鱼?