原先的測試不全面,發覺class結構一復雜,反序列化時分析JSon string出現了嚴重的效率問題。 多方求助也沒有解決。 其間試了很多人的JSon實現(官方的兩個,google到的一個,teddy的nbear裡的)。
- if ((b >= 0 && b <= 9) || b == . || b == - || b == +)
- { try {
- return Convert.ToInt32(s); }
- catch (Exception e) {
- string msg = e.Message; }
- try {
- return Convert.ToDouble(s, NumberFormatInfo.InvariantInfo);
- } catch (Exception e) {
- string msg = e.Message; } }
都有這個問題。 後來,一點點排查,先從一個最簡單的分析JSon string開始,逐漸往裡面加屬性測試。 最後發覺當我加入 a:1.01 時速度很慢,而 a:1 時速度正常。 然後才定位到問題所在: 官方代碼:
- class test
- {
- var $var = 0;
- function add(){
- echo $var+10;
- }
- }
- $unserialize_var = new test;
- $serializeserialize_var = serialize($unserialize_var);
- echo $serialize_var;
- $unserialize_var = null;
- $unserializeunserialize_var = unserialize($serialize_var);
- $unserialize_var->add();
- $arr = array
- (
- 'Name'=>'Peter',
- 'Age'=>20
- );
- $JSonencode = JSon_encode($arr);
- echo $JSonencode;
這段代碼在分析JSon string裡面會有嚴重的效率問題。 應該是C#的異常機制不完善造成的! 在Java裡,利用異常做這種工作對效率沒有任何影響,(當然,也不提倡這麼寫,偷懶的行為)。
- ''' <summary>
- ''' JSON 序列化。
- ''' </summary>
- ''' <param name="Value">物件。</param>
- Public Shared Function JSonSerialize(ByVal Value As Object) As String
- Dim oSerializer As System.Web.Script.Serialization.JavaScriptSerializer
- oSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
- Return oSerializer.Serialize(Value)
- End Function
- ''' <summary>
- ''' JSON 反序列化。
- ''' </summary>
- ''' <param name="Text">JSON 字符串。</param>
- Public Shared Function JSonDeserialize(Of T)(ByVal Text As String) As T
- Dim oSerializer As System.Web.Script.Serialization.JavaScriptSerializer
- oSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
- Return oSerializer.Deserialize(Of T)(Text)
- End Function
【編輯推薦】