我正在进行角度应用,以显示所选年份的生产计划。 来自服务器的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>
以上设置决定了可以序列化的最大字符数。
因此,如果字符数大于允许值,我计划执行延迟加载。
如何在自定义类列表中找到字符数?
答案 0 :(得分:3)
IPlan中的属性是否有大小限制?通常他们会。构造IPlan的示例实例,将每个属性设置为其最大值。序列化并获取其长度。现在将maxJsonLength除以你得到的长度,这大约是你可以返回的最大项目数,在最坏的情况下。如果maxJsonLength实际上设置为您在代码段中的值,则允许2GB的有效负载,这似乎比您在实践中为人类可读实体列表所见的要高得多。也许这个限制太高了? (那是另一个讨论)。
// opening '[' and closing ']' for JSON array
int serializedSize = 2;
for (int i = 0; i < plans.Length; i++)
{
if (i > 0)
{
// account for commas that occur between items
serializedSize++;
}
serializedSize += serializer.Serialize(plan).Length;
if (serializedSize > maxJsonLength)
{
// now you know where to stop
}
}
这很昂贵,因为您有效地完成了所有序列化两次 - 一次用于计算,一次用于实际响应。它也很脆弱,因为如果数组的序列化发生任何变化,这段代码就必须改变。
最好先做第一种方法并选择一个安全的最大数量的物品来返回,特别是如果你的限制真的是2演出。
答案 1 :(得分:0)
如果你有一个(类似的)对象列表,你可以序列化其中一个或几个,计算序列化JSON字符串的大小,并通过外推估计完整列表的大小(作为JSON)。