调试序列化期间消耗的产量回报的最佳方法是什么?

时间:2015-09-06 17:28:31

标签: c# visual-studio debugging serialization

我正在开发一个在页面中嵌入JSON的应用程序。一些简化的例子:

public ViewResult Page(IEnumerable<LolCat> lolCats)
{
    var json = new
    {
        localCats = ToJson(lolCats),
    };

    return View( json ); // this gets serialized somewhere in the ASP pipeline
}

IEnumerable<object> ToJson(IEnumerable<LolCat> lolCats)
{
    foreach ( var lolCat in lolCats )
        yield return new { name = lolCat.name };
}

JSON 在ASP.NET管道中的某个位置自动序列化

在此示例中,假设有时NULL会滑入lolCats,抛出异常。问题是在整个应用程序中可能会在很多不同的地方调用ToJson函数。

如何找出对ToJson的哪个调用是负责该异常的?调用堆栈在Serializer中结束,实际上正在消耗此IEnumerable,因此您不会看到&#39;原始堆栈跟踪&#39;

The call stack ends in the Serializer that is actually consuming this IEnumerable, and therefore that's not working

一个简单的解决方法是在ToList()内拨打Page。但是,我正在寻找一种不会破坏方法懒惰的方法。

1 个答案:

答案 0 :(得分:1)

由于延迟性质,您永远不会得到ToJson()实际产生异常的调用。直到首次枚举(系列化时),才首先检查该集合。

你需要向你的枚举器注入一些关于它的内容的信息。

如,

IEnumerable<object> ToJson(IEnumerable<LolCat> lolCats, string id)
{
    try
    {
        foreach (var lolCat in lolCats)
            yield return new { name = lolCat.name };
    }
    catch (Exception ex)
    {
        throw new Exception(id, ex); // use a more appropriate exception
    }
}

然后,只需要生成id即可帮助识别来电者。