Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON对象不会序列化大数据_C#_Angularjs_Json_Asp.net Mvc_Serialization - Fatal编程技术网

C# JSON对象不会序列化大数据

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

我正在尝试用JSON序列化数据。但我面临以下例外

用户代码未处理OutOfMemoryException。
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吗?玻璃鱼?