2017-07-03 20 views
0

为了提高性能,我尝试将自定义序列化程序与Newtonsoft JSON一起使用,但由于某些原因,函数会随机停止,并且调用序列化程序的函数也会结束。 没有例外,因此我无法确定原因。 这是函数:使用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行)一样。

回答

1

你是否有机会在另一个线程下调用此代码?也许背景工作者? 如果是这样,那么这可能是不抛出异常的原因。 只需将所有代码包装在Try-Catch块中,您就可以捕获所有异常。

更新:

我认为引发异常,因为你把一个JSON对象里的数组是没有属性的名称,如果你这样做了,通过插入此行

writer.WritePropertyName("arrayKey"); 

在第89行之前,以前的异常将会消失,但是你会在循环中得到一个新异常,这个新的异常是由于键值对必须位于一个对象内而引起的,所以你不能直接将它们放在阵列。

无论如何,我定你贴的代码,并得到了它的结果如下:

[ 
    { 
     "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(); 
+0

的种类,该功能是由被称为另一个函数调用每250ms由一个定时器(非线程定时器)。我会尝试你的想法。 –

+0

好吧得到了例外,并更新了我原来的帖子,仍然不确定它的含义。 –

+0

我更新了我的答案。 –