您的位置:首页 > Web前端 > JavaScript

.NET序列化工具Jil、Json.NET和Protobuf的简单测评

2016-08-23 16:24 477 查看
  前一段时间逛园子的时候发现有人比较了Jil、Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅。

前期准备

  依赖类库的话,可以通过Nuget在公共组件库总下载,这里不做赘述。我在数据库中生成了一些PostInfo数据,取100条进行测试:

  

[ProtoContract]
public class PostInfo
{
[ProtoMember(1)]
public long P_ID { get; set; }

[ProtoMember(2)]
public string P_Title { get; set; }

[ProtoMember(3)]
public string P_Content { get; set; }

[ProtoMember(4)]
public string P_CreateTime { get; set; }
}


Jil

  Jil是一款高性能的Json序列化工具,大名鼎鼎的StackOverflow也在用它,不少园友说他的性能比Json.NET更快,由于我本身机器环境的原因未能使用最新版,这里使用的是2.6.0版本。

//序列化
JSON.Serialize<List<PostInfo>>(infos);
//反序列化
JSON.Deserialize<List<PostInfo>>(jilSerialize);


Json.NET

  Json.NET(Newtonsoft.Json)也是一款常用的Json序列化工具,我现在的公司就在使用它,这里使用版本是9.0.1。

//序列化
JsonConvert.SerializeObject(infos);
//反序列化
JsonConvert.DeserializeObject<List<PostInfo>>(newtonSerialize);


Protobuf-NET

  Protobuf是谷歌出品的数据序列化工具,优点是体积小速度快,但是它并不支持.NET,目前使用的是Java的移植版,而且它的数据格式不能被JS解析,个人认为不太适合作为公共的数据传输规范,目前使用的版本是2.0.0.668,使用起来也比前面两个麻烦,如PostInfo中还要加上ProtoContract和ProtoMember特性。这里顺便提一下,在我使用的过程中发现数据量过大或者使用UTF-8格式对数据进行操作时,Protobuf均会报出异常,可能是我本人使用的问题,也可能是新版本中已经解决的这个问题。

//序列化
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<List<PostInfo>>(ms, infos);
protoSerialize = Encoding.Unicode.GetString(ms.ToArray());
}

//反序列化
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(protoSerialize)))
{
var protobuf_infos = Serializer.Deserialize<List<PostInfo>>(ms);
}


执行结果

  序列化时间比较:Protobuf(39ms)>Json.NET(84ms)>Jil(168ms)

  反序列化时间比较:Protobuf(6ms)>Json.NET(24ms)>Jil(58ms)

  通过执行结果可以看到Protobuf果然是一骑千里绝尘去,甩了其他工具好几条街,可以考虑一下用它来传输和存储日志信息,但Josn.NET的性能和Jil的性能并不如园友们测试的那样Jil的性能要高于Json.NET,我尝试将数据量增加,结果依旧如此,预估有可能跟我引用的版本存在一些关系,但因为环境所限,我也就不折腾了,好了就到这里了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: