之前有个项目(C#+html)需要把对象转换为JSON字符串,返回给web页进行相应的处理,这也是常用的技术了;
原来一直都在用JavaScriptSerializer,后面发现转换时很占用时间,对比较一些其它的第三方组件,测试后都快不到那里去,后来无意中找到fastJSON,说是最快的;
对比的一下,的确快很多,如下图,
从上到下分别是:fastJSON、Newtonsoft.Json、JavaScriptSerializer
虽然转换速度很快,但也发现了几个问题: 简单的对象没有问题,但如果是复合对象(对象中有强类型的对象属性或静态属性 ),就根本没法用了
1.对象中的 public静态属性也进行序列处理
2.对public内部成员属性(Field)也进行了序列
2.对象的类型计数的限制(当序列的对象类型数大于255时,会报错)
基于这三个问题,我对源代码进行了相应的修改
把JSONParameters类SerializerMaxDepth属性的类型改成 了int (原来是byte)
去掉对静态成员的查找
注解了对Fileld成员的查找
最后:
可能还会有一些其它的问题,还好这个组件的代码还是比较容易改的,下面是我的fastJSON的配置代码
fastJSON.JSONParameters jsonP = new fastJSON.JSONParameters() ;
//jsonP.EnableAnonymousTypes = true;
//jsonP.ParametricConstructorOverride //这个是在反序列时用上,是否对没有无参的构造器的类型对于处理(我也不太明白是什么意思,但从字面意思是说重写构造器,但我在代码中没有看到这点)
//下面两项要同时配置:
jsonP.ShowReadOnlyProperties =true ; //是否对只读的属性进行序列处理(没有Set的属性)
jsonP.SerializerMaxDepth = 1255; //这里原来最大是255的,我现在改成了1255
//jsonP.DateTimeMilliseconds = false ;
jsonP.UseEscapedUnicode = false ; //是否在转换时进行UNICode编码
Stopwatch myWatch = new Stopwatch();
myWatch.Start();
string ss = fastJSON.JSON.ToJSON(list , jsonP);
myWatch.Stop();
long myUseTime = myWatch.ElapsedMilliseconds;
//Console.WriteLine(ss);
//File.WriteAllText("d:\\AAAtest.txt", ss);
Console.WriteLine( "Length:" + ss.Length + "---> Time:" + myUseTime.ToString() ) ;