2016-01-19 260 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對象?它看起來如何?你也可以使用我的答案的第二部分來檢查對象的大小。 –