C# 如何在序列化之前确定JSON表示的长度

C# 如何在序列化之前确定JSON表示的长度,c#,json,angularjs,C#,Json,Angularjs,我正在做一个显示所选年份生产计划的角度应用程序。 来自服务器的json数据被解析并绑定到一个模型,以便angular负责更改视图 我已经用aspx编写了web服务,并将其序列化为 JavaScriptSerializer serializer = new JavaScriptSerializer(); json = serializer.Serialize(planData); 其中planData是类的列表 List<IPlan> planData = (List<IP

我正在做一个显示所选年份生产计划的角度应用程序。 来自服务器的json数据被解析并绑定到一个模型,以便angular负责更改视图

我已经用aspx编写了web服务,并将其序列化为

JavaScriptSerializer serializer = new JavaScriptSerializer();
json = serializer.Serialize(planData);
其中planData是类的列表

  List<IPlan> planData = (List<IPlan>)HttpContext.Current.Session["PlanData"];
问题是可以序列化的字符数有一个最大限制

<jsonSerialization maxJsonLength="2147483647">
</jsonSerialization>
上述设置确定可以序列化的最大字符数

<jsonSerialization maxJsonLength="2147483647">
</jsonSerialization>
因此,如果字符数大于允许值,我计划执行延迟加载


如何找到自定义类列表中的字符数?

如果您有一个类似对象的列表,您可以序列化其中一个或几个对象,计算序列化JSON字符串的大小,并通过外推将完整列表的大小估计为JSON。

廉价、简单但保守的方法: IPlan中的属性是否有大小限制?他们通常会这样做。构造IPlan的示例实例,将每个属性设置为其最大值。序列化它并获取其长度。现在将maxJsonLength除以得到的长度,这大约是在最坏的情况下可以返回的最大项数。如果maxJsonLength实际设置为代码段中的值,则允许2GB的有效负载,这似乎比您在实践中遇到的人类可读实体列表要高得多。也许这个限制太高了?这是另一个讨论

不建议采用昂贵、愚蠢的方法 这是非常昂贵的,因为所有序列化都要进行两次——一次用于计算,一次用于实际响应。它也很脆弱,因为如果数组的序列化中发生任何更改,则必须更改此代码


最好使用第一种方法并选择一个安全的最大返回项目数,特别是如果您的限制实际上是2 Gig。

更好的标题:在返回之前确定JSON表示的长度serialization@DrKoch中国。谢谢你的建议,你有没有计算过一个小平面数据中的字符数,并估计在达到2147483647之前它可以有多大?@DrKoch。不知道。我不知道如何遍历列表并获取字符数。请展示一个IPlan示例,它的成员的典型大小是什么?不会有类似的对象,因为每天listplan中每个项目的字符值都不同。为什么不总是lazyload?或者总是添加少量的项目,然后懒散地加载其余的项目。每天的项目无法计数?按天装载,不是一次全部吗?@Robert_Junior他说相似不一样这基本上是一个大数规则的应用如果样本是集合的代表性样本你可以使用样本的平均大小作为集合的平均大小不确定长度是否正确,因为字符串长度和字节大小可能不同。