大佬教程收集整理的这篇文章主要介绍了json.net在序列化时限制maxdepth,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们正在经历间歇性的内存使用突然激增,我们怀疑它可能源于json.net在序列化数据时没有识别引用循环(因为实体框架可能正在使用代理类进行一些延迟加载voodoo,这些代码类在json.net的雷达下)
我以为我会限制Json.net被允许用于序列化数据的深度(至少在发生这种情况时我们会得到一个明智的异常,所以我们可以在数据模型中修复它),但我很快就发现了R_978_11845@axDepth JsonserializerSetTings的属性仅在反序列化对象时启动.
在序列化时是否有任何已知的方法对json.net施加限制?
MaxDepth
在序列化时会被忽略.您可以做的是继承
JsonTextWriter
并自己进行检查:
public class MaxDepthJsontextWriter : JsontextWriter { public int? MaxDepth { get; set; } public int MaxObservedDepth { get; private set; } public MaxDepthJsontextWriter(TextWriter writer,JsonserializerSetTings setTings) : base(writer) { this.MaxDepth = (setTings == null ? null : setTings.MaxDepth); this.MaxObservedDepth = 0; } public MaxDepthJsontextWriter(TextWriter writer,int? maxDepth) : base(writer) { this.MaxDepth = maxDepth; } public override void WriteStartArray() { base.WriteStartArray(); checkDepth(); } public override void WriteStartConstructor(String Name) { base.WriteStartConstructor(Name); checkDepth(); } public override void WriteStartObject() { base.WriteStartObject(); checkDepth(); } private void checkDepth() { MaxObservedDepth = Math.Max(MaxObservedDepth,Top); if (Top > MaxDepth) throw new JsonserializationException(String.Format("Depth {0} Exceeds MaxDepth {1} at path \"{2}\"",Top,MaxDepth,Path)); } }
然后,要手动生成JSON字符串,您可以像这样使用它:
var setTings = new JsonserializerSetTings { MaxDepth = 10 }; String json; try { using (var writer = new StringWriter()) { using (var jsonWriter = new MaxDepthJsontextWriter(writer,setTings)) { Jsonserializer.Create(setTings).serialize(jsonWriter,myClass); // Log the MaxObservedDepth here,if you want to. } json = writer.ToString(); } Debug.WriteLine(json); } catch (Exception eX) { Debug.WriteLine(eX); json = null; throw; }
由于您的代码包含web-api,如果您要在Web API调用中执行此操作,则可以按照Rick Strahl的说明为JSON创建@L_266_11@mediaTypeFormatter:Using an alternate JSON Serializer in ASP.NET Web API;然后在生成json字符串时在OnWriteToStreamAsync方法中使用上面的代码.
以上是大佬教程为你收集整理的json.net在序列化时限制maxdepth全部内容,希望文章能够帮你解决json.net在序列化时限制maxdepth所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。