我有一个包含大约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
}
答案 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进行检查。
阅读更多内容