在.NET中序列化大型JSON和通过HTTP流式传输
问题描述:
我正尝试序列化每个12列的900000条记录到JSON对象并通过HTTP在.NET中进行流式传输。我得到一个内存不足的例外,因为它看起来像对象最初创建,然后流式传输(我通过调试应用程序意识到这一点)。这是到目前为止我的代码:在.NET中序列化大型JSON和通过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
编辑:当我尝试用更少的记录,以连载(最多〜30万),它按预期工作。
答
找到了解决办法,并发布有兴趣的人士:
只需添加:response.Flush()
writer.Flush()
后。
通过调试应用程序,我意识到它在'writer.WriteEndArray();'之后得到内存不足。它看起来像是首先将对象序列化并随后通过HTTP发送。是否可以使用Async并行执行这些操作? – jackgu1988