C# JSON.NET的System.OutOfMemoryException和List<;对象>;

C# JSON.NET的System.OutOfMemoryException和List<;对象>;,c#,asp.net-mvc,json,json.net,C#,Asp.net Mvc,Json,Json.net,我正在做一个过程,在这个过程中,我的服务器生成一个JSON.Net文件,其中包含25000条记录,大小为85MB,然后这个文件由客户端导入 客户端下载文件并使用JSON.Net进行反序列化 我的问题是,在不同的时间和机器上,反序列化命令给出: System.OutOfMemoryException 注意:我试图手动使用GC,但没有成功 代码生成错误: 我的班级地址 我在玩上面链接的答案:。下面的轻微修改可能会满足您的需要。它逐项读取并反序列化JSON,而不是将整个列表加载到内存中: public

我正在做一个过程,在这个过程中,我的服务器生成一个JSON.Net文件,其中包含25000条记录,大小为85MB,然后这个文件由客户端导入

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

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

System.OutOfMemoryException

注意:我试图手动使用GC,但没有成功

代码生成错误: 我的班级地址
我在玩上面链接的答案:。下面的轻微修改可能会满足您的需要。它逐项读取并反序列化JSON,而不是将整个列表加载到内存中:

public static class JsonConvertExtensions
{
    public static IEnumerable<T> DeserializeEnumerableFile<T>(string filename)
    {
        using (var stream = new StreamReader(filename))
            foreach (var item in DeserializeEnumerable<T>(stream))
                yield return item;
    }

    public static IEnumerable<T> DeserializeEnumerableString<T>(string json)
    {
        using (var sr = new StringReader(json))
            foreach (var item in DeserializeEnumerable<T>(sr))
                yield return item;
    }

    public static IEnumerable<T> DeserializeEnumerable<T>(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<T>(reader);
                }
            }
        }
    }
}
公共静态类JsonConvertExtensions
{
公共静态IEnumerable反序列化EnumerableFile(字符串文件名)
{
使用(var stream=newstreamreader(文件名))
foreach(反序列化枚举(流)中的var项)
收益回报项目;
}
公共静态IEnumerable反序列化EnumerableString(字符串json)
{
使用(var sr=newstringreader(json))
foreach(反序列化枚举(sr)中的var项)
收益回报项目;
}
公共静态IEnumerable反序列化枚举(TextReader TextReader)
{
var serializer=JsonSerializer.CreateDefault();
使用(JsonTextReader=newJSontextReader(textReader))
{
while(reader.Read())
{
if(reader.TokenType==JsonToken.StartObject)
{
//从流中加载每个对象并对其进行处理
产生返回序列化程序。反序列化(读取器);
}
}
}
}
}

您能使用吗?@CodeCaster在哪里?要生成文件?可能需要。但我做不到。你能举个例子吗@codecaster单击。可能重复的
using (StreamWriter file = File.CreateText("C:\\test.json"))
{
    JsonSerializer serializer = new JsonSerializer();                        
    serializer.Serialize(file, listAddress);                        
}
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; }
}
public static class JsonConvertExtensions
{
    public static IEnumerable<T> DeserializeEnumerableFile<T>(string filename)
    {
        using (var stream = new StreamReader(filename))
            foreach (var item in DeserializeEnumerable<T>(stream))
                yield return item;
    }

    public static IEnumerable<T> DeserializeEnumerableString<T>(string json)
    {
        using (var sr = new StringReader(json))
            foreach (var item in DeserializeEnumerable<T>(sr))
                yield return item;
    }

    public static IEnumerable<T> DeserializeEnumerable<T>(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<T>(reader);
                }
            }
        }
    }
}