为了提高性能,我尝试将自定义序列化程序与Newtonsoft JSON一起使用,但由于某种原因,该函数随机停止,调用序列化程序的函数也会结束。 没有例外,因此我无法确定原因。这是函数:
public string customSerialize(List<EntityJSON> data)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
JsonTextWriter writer = new JsonTextWriter(sw);
writer.WriteStartObject();
writer.WriteStartArray(); // <-- Line 89
foreach (EntityJSON json in data)
{
writer.WritePropertyName("type");
writer.WriteValue(json.type);
writer.WritePropertyName("name");
writer.WriteValue(json.name);
writer.WritePropertyName("position");
writer.WriteStartArray();
writer.WritePropertyName("x");
writer.WriteValue(json.position.x);
writer.WritePropertyName("z");
writer.WriteValue(json.position.z);
writer.WritePropertyName("rot");
writer.WriteValue(json.position.rot);
writer.WriteEndArray();
writer.WritePropertyName("flags");
writer.WriteValue(json.flags);
}
writer.WriteEndArray();
writer.WriteEndObject();
return sb.ToString();
}
更新:感谢@Ayoub_B,这是一个例外:Exception: Newtonsoft.Json.JsonWriterException: Token StartArray in state ObjectStart would result in an invalid JSON object. Path ''. ...
可悲的是,我不知道这意味着什么,我已经在上面的代码中标记了异常(第89行)。
答案 0 :(得分:1)
您是否有机会在另一个线程下调用此代码?也许是背景工作者? 如果是这样,那么这可能就是为什么不抛出异常的原因。 只需将所有代码包装在Try-Catch块中,您就可以捕获所有异常。
<强>更新强>
我认为引发异常是因为您在没有属性名称的情况下将数组放在JSON对象中,如果这样做,则通过插入此行
writer.WritePropertyName("arrayKey");
在第89行之前的,前一个异常将消失,但是你会在循环中得到一个新的异常,这是因为键值对必须在一个对象{}内,所以你可以&#39 ;将它们直接放在数组中。
无论如何,我修复了您发布的代码并从中获得了以下结果:
[
{
"type": "type_0",
"name": "type_0",
"position": {
"x": "position.x_0",
"z": "position.a_0",
"rot": "position.rot_0"
},
"flags": "flags_0"
},
{
"type": "type_1",
"name": "type_1",
"position": {
"x": "position.x_1",
"z": "position.a_1",
"rot": "position.rot_1"
},
"flags": "flags_1"
}
]
代码:
writer.WriteStartArray(); // <-- Line 89
for (int i = 0; i < 2; i++)
{
writer.WriteStartObject();
writer.WritePropertyName("type");
writer.WriteValue("type_" + i);
writer.WritePropertyName("name");
writer.WriteValue("type_" + i);
writer.WritePropertyName("position");
writer.WriteStartObject();
writer.WritePropertyName("x");
writer.WriteValue("position.x_" + i);
writer.WritePropertyName("z");
writer.WriteValue("position.a_" + i);
writer.WritePropertyName("rot");
writer.WriteValue("position.rot_" + i);
writer.WriteEndObject();
writer.WritePropertyName("flags");
writer.WriteValue("flags_" + i);
writer.WriteEndObject();
}
writer.WriteEndArray();