带有List 的JSON.NET的System.OutOfMemoryException

我正在进行一个过程,我的服务器使用JSON.Net生成一个文件,其中有25000条记录,大小为85MB,然后该文件由客户端导入。

客户端下载文件并使用JSON.Net进行反序列化。

我的问题是时间和不同的机器,反序列化命令给出:

System.OutOfMemoryException

注意:我试图手动使用GC不起作用。

代码生成错误:

 var listAddress = JsonConvert.DeserializeObject<List
>(File.ReadAllText(@"c:\Temp\test.json");

代码生成JSON文件:

 using (StreamWriter file = File.CreateText("C:\\test.json")) { JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(file, listAddress); } 

我的class级地址

 public class Endereco { public int Codigo { get; set; } public string CGCCPF { get; set; } public char? TipoPessoa { get; set; } public string UF { get; set; } public string SiglaDoRG { get; set; } public string MaeFantasica { get; set; } public string DescEndereco { get; set; } public string Complemento { get; set; } public string Bairro { get; set; } public string CEP { get; set; } public string Pai { get; set; } public string Cidade { get; set; } public string Telefone { get; set; } public string Fax { get; set; } public string Email { get; set; } public string IEouRG { get; set; } public string OrgaoEmissorRG { get; set; } public DateTime? DataNascimento { get; set; } public CampoObservacao Observacao { get; set; } public DateTime? DataRegistro { get; set; } public DateTime? DataUltAlteracao { get; set; } public int? CodigoFuncionario { get; set; } public string Ramal { get; set; } public DateTime? DataDeEmissaoRG { get; set; } public string Alfa1 { get; set; } public string Alfa2 { get; set; } public double? Num1 { get; set; } public double? Num2 { get; set; } public string PontoReferencia { get; set; } public string Celular { get; set; } public string EnderecoWeb { get; set; } public string Conta { get; set; } public string Rasocial { get; set; } public int? NcCodigo { get; set; } public int? NcCodigoC { get; set; } public string CFOP { get; set; } public string Numero { get; set; } public int? CodigoMunicipio { get; set; } public int? CodigoPais { get; set; } public string Suframa { get; set; } public string NumeroNit { get; set; } public string InscricaoMunicipal { get; set; } public string IE { get; set; } public bool Ativo { get { return !Observacao["Status"].Equals("I"); } set { Observacao["Status"] = !value ? "I" : String.Empty; } } public Endereco() { Observacao = new CampoObservacao(); } public char? TipoDeMercado { get { return !String.IsNullOrEmpty(Observacao["Tipo de Mercado"]) ? (char?)Observacao["Tipo de Mercado"][0] : null; } set { Observacao["Tipo de Mercado"] = value.HasValue ? value.ToString() : String.Empty; } } public char? EstadoCivil { get { return !String.IsNullOrEmpty(Observacao["EstadoCivil"]) ? (char?)Observacao["EstadoCivil"][0] : null; } set { Observacao["EstadoCivil"] = value.HasValue ? value.ToString() : String.Empty; } } public Cliente Cliente { get; set; } public Funcionario Funcionario { get; set; } public Filial Filial { get; set; } } 

我正在玩上面链接的答案:一次反序列化一个项目的json数组流 。 以下稍作修改可能会满足您的需求。 它逐项读取和反序列化JSON,而不是将整个列表加载到内存中:

 public static class JsonConvertExtensions { public static IEnumerable DeserializeEnumerableFile(string filename) { using (var stream = new StreamReader(filename)) foreach (var item in DeserializeEnumerable(stream)) yield return item; } public static IEnumerable DeserializeEnumerableString(string json) { using (var sr = new StringReader(json)) foreach (var item in DeserializeEnumerable(sr)) yield return item; } public static IEnumerable DeserializeEnumerable(TextReader textReader) { var serializer = JsonSerializer.CreateDefault(); using (JsonTextReader reader = new JsonTextReader(textReader)) { while (reader.Read()) { if (reader.TokenType == JsonToken.StartObject) { // Load each object from the stream and do something with it yield return serializer.Deserialize(reader); } } } } }