【问题标题】:Serialize large JSON and stream over HTTP in .NET在 .NET 中通过 HTTP 序列化大型 JSON 和流式传输
【发布时间】:2017-05-29 13:11:35
【问题描述】:

我正在尝试将 900000 条记录(每条 12 列)序列化为一个 JSON 对象,并通过 .NET 中的 HTTP 将其流式传输。我遇到了内存不足异常,因为看起来对象最初是创建然后流式传输的(我通过调试应用程序实现了这一点)。到目前为止,这是我的代码:

public class JsonStreamingResult : ActionResult
{
    private IEnumerable itemsToSerialize;

    public JsonStreamingResult(IEnumerable itemsToSerialize)
    {
        this.itemsToSerialize = itemsToSerialize;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/json";
        response.ContentEncoding = System.Text.Encoding.UTF8;
        JsonSerializer serializer = new JsonSerializer();

        object itm;

        using (StreamWriter sw = new StreamWriter(response.OutputStream))
            using (JsonTextWriter writer = new JsonTextWriter(sw))
            {
                writer.WriteStartArray();
                foreach (object item in itemsToSerialize)
                {
                    Newtonsoft.Json.Linq.JObject obj = Newtonsoft.Json.Linq.JObject.FromObject(item, serializer);
                    obj.WriteTo(writer);
                    writer.Flush();
                }

                writer.WriteEndArray();
            }
    }
}

public class HomeController : Controller
{

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult streamMason(int id)
    {
        var masonItems = new List<object>();
        DataContext dc = new DataContext();
        var viewData = dc.Articles.GetPublishedArticles(null, id);

        int cnt = 0;

        for (int i = 0; i < 900000; i++)
        {
            masonItems.Add(new
                    {
                    Field1 = "test1",
                    Field2 = "test2",
                    Field3 = "test3",
                    Field4 = "test4",
                    Field5 = "test5",
                    Field6 = "test6",
                    Field7 = "test7",
                    Field8 = "test8",
                    Field9 = "test9",
                    Field10 = "test10",
                    Field11 = "test11",
                    Field12 = "test12"
                    });
        }

        return new JsonStreamingResult(masonItems);
    }
}

我的问题:是否可以在生成对象的同时进行流式传输?

我的代码基于此:Streaming large list of data as JSON format using Json.net

编辑:当我尝试使用较少的记录(最多约 300000 条)进行序列化时,它按预期工作。

【问题讨论】:

  • 通过调试应用程序,我意识到它在writer.WriteEndArray(); 之后内存不足。似乎首先对象被序列化,然后通过 HTTP 发送。是否可以使用 Async 并行执行这些操作?

标签: c# .net json serialization stream


【解决方案1】:

找到解决方案并为任何感兴趣的人发布:

只需在writer.Flush() 之后添加:response.Flush()

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 2018-03-06
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2010-10-12
    • 2012-03-30
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多