Json.SerializeObject OutOfMemory Exception

时间:2016-01-19 18:49:32

标签: c# json

我有一个包含大约400个对象的列表,每次我尝试序列化它时都会出现一个outofmemory异常。

问题在于我正在监视服务器内存,并且它的使用率从未超过40%,所以我对此错误感到很遗憾。

 try
 {
    str = JsonConvert.SerializeObject(list);
 }
 catch(Exception ex)
 {
    throw ex;
 }

我仔细检查过,序列化的类没有复杂类型或对同类型其他对象的引用。

如果我尝试做list.First()

,我甚至会得到同样的例外
namespace ilimitada.ServicioDistribucion.AnalisisDatos.Entidades
{
    using ilimitada.Dominio.Pervasive.SCI.Core.Enumeradores;
    using System;
    using System.Runtime.CompilerServices;

    public class CuentaCobrar
    {
        public CuentaCobrar()
        {
            this.Nit = string.Empty;
            this.TipoNit = string.Empty;
            this.RazonSocial = string.Empty;
            this.PrimerNombre = string.Empty;
            this.SegundoNombre = string.Empty;
            this.PrimerApellido = string.Empty;
            this.SegundoApellido = string.Empty;
            this.Direccion = string.Empty;
            this.CodigoCiudad = string.Empty;
            this.Indicativo = string.Empty;
            this.Telefono = string.Empty;
            this.Celular = string.Empty;
            this.Email = string.Empty;
            this.CodigoMunicipio = string.Empty;
            this.CodigoPais = string.Empty;
            this.Plazo = 0;
            this.CodigoActividadEconomica = string.Empty;
            this.Naturaleza = string.Empty;
            this.TieneRut = "No";
            this.Activo = "No";
            this.TipoTransaccion = Transaccion.Ninguna;
            this.Documento = string.Empty;
            this.OrdenFacturacion = string.Empty;
            this.DocumentoReferencia = string.Empty;
            this.SaldoDocumento = 0.0;
            this.FechaDocumento = DateTime.Now;
            this.FechaVencimiento = DateTime.Now;

            this.Compania = string.Empty;
        }

        public string Activo { get; set; }

        public string Celular { get; set; }

        public string CodigoActividadEconomica { get; set; }

        public string CodigoCiudad { get; set; }

        public string CodigoMunicipio { get; set; }

        public string CodigoPais { get; set; }

        public string Direccion { get; set; }

        public string Documento { get; set; }

        public string DocumentoReferencia { get; set; }

        public string Email { get; set; }

        public DateTime FechaDocumento { get; set; }

        public DateTime FechaVencimiento { get; set; }

        public string Indicativo { get; set; }

        public string Naturaleza { get; set; }

        public string Nit { get; set; }

        public string OrdenFacturacion { get; set; }

        public int Plazo { get; set; }

        public string PrimerApellido { get; set; }

        public string PrimerNombre { get; set; }

        public string RazonSocial { get; set; }

        public double SaldoDocumento { get; set; }

        public string SegundoApellido { get; set; }

        public string SegundoNombre { get; set; }

        public string Telefono { get; set; }

        public string TieneRut { get; set; }

        public string TipoNit { get; set; }

        public Transaccion TipoTransaccion { get; set; }

        public string Compania { get; set; }
    }
}

这是枚举

public enum Transaccion
    {
        Ninguna = 0,
        OtrasCxP = 9,
        Compra = 10,
        NDCompras = 11,
        NCCompras = 12,
        NDOtrasCxP = 13,
        NCOtrasCxP = 14,
        TransladosEntreBodegas = 15,
        OtrasEntradas = 16,
        OtrasSalidas = 17,
        EntradasMercanciaConsignacion = 18,
        SalidadasMercanciaConsignacion = 19,
        ConsumosDonacion = 20,
        AnulacionConsumosDonacion = 21,
        Venta = 30,
        VentasMostrador = 31,
        NCVentas = 33,
        NDVentas = 34,
        NDChequesDev = 40,
        NCChequesDev = 41,
        NDCargosVarios = 42,
        NCAbonosVarios = 43,
        AnticipoCxC = 44,
        NDInteresMora = 45,
        NCBanco = 70,
        NDBanco = 71,
        Cheques = 72,
        Consignaciones = 73,
        TrasladosBancarios = 74,
        AnticipoCxP = 75,
        ChequesAnulados = 76,
        ReciboCaja = 90,
        AnulacionReciboCaja = 91,
        CostosProduccion = 95
    }

2 个答案:

答案 0 :(得分:2)

循环引用可能导致OutOfMemory异常。试着检查一下这种情况并非如此,因为我曾多次遇到这种异常。

我们在列表中有一个项目指向一个项目,该项目又指向列表中的第一个项目,从而导致序列化过程中出现无限循环。

<强>更新

您可以通过更新代码来忽略循环引用:

 try
 {
    str = JsonConvert.SerializeObject(list, Formatting.Indented, 
                            new JsonSerializerSettings { 
                                   ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
                            });
 }
 catch(Exception ex)
 {
    throw ex;
 }

答案 1 :(得分:0)

就像@Oluwafemi所说,你可能有循环参考。您可以使用NDepend Detect Dependency Tool进行检查。

您还可以通过Find out the size of a .net object

阅读更多内容