2016-01-19 262 views
0

我有一个包含大约400个对象的列表,每次我尝试序列化它时,都会遇到一个内存异常。Json.SerializeObject 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 
    } 
+0

如果你只序列化该列表中的一些项目会发生什么呢?它产生了什么? –

+0

你必须序列化为一个字符串吗?根据您对数据的处理方式,您可能可以直接将JSON流式传输到目标。 – user5090812

+0

将试图序列化与一个项目列表 –

回答

2

循环引用可能导致内存溢出的例外,我甚至得到了同样的异常。试着检查一下情况并非如此,因为我偶尔遇到了这个异常。

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

更新:

您可以通过更新,像这样的代码忽略循环引用:

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

请参阅更新,我不认为它可以是循环引用,该类只有本机类型,不参考其他类型 –

+0

'Transaccion'中的内容是什么,你仍然会得到与上面的代码相同的错误? – Oluwafemi

+0

看到uodate,是的,我得到了与上面的代码 –

0

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

您也可以可能会读通过Find out the size of a .net object

+0

请参阅更新,我不认为它可以是循环引用,该类只有本地类型,不参考其他类型 –

+0

什么是Transaccion对象?它看起来如何?你也可以使用我的答案的第二部分来检查对象的大小。 –