I have recently come across a comparison of fast JSON serializers in .NET, which shows that Jil JSON serializer is one of the fastest.

Jil is created by Kevin Montrose developer at StackOverlow and it is apparently heavily used by Stackoveflow.

This is only one of many benchmarks you can find on Github project website.

You can find more benchmarks and the source code at this locationhttps://github.com/kevin-montrose/Jil

In this short article I will cover how to replace default JSON serializer in Web API with Jil.

Create Jil MediaTypeFormatter

First, you need to grab Jil from NuGet

PM> Install-Package Jil

After that, create JilFormatter using code below.

public class JilFormatter : MediaTypeFormatter
{
private readonly Options _jilOptions;
public JilFormatter()
{
_jilOptions=new Options(dateFormat:DateTimeFormat.ISO8601);
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true));
SupportedEncodings.Add(new UnicodeEncoding(bigEndian: false, byteOrderMark: true, throwOnInvalidBytes: true));
}
public override bool CanReadType(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return true;
} public override bool CanWriteType(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return true;
} public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger)
{
var task= Task<object>.Factory.StartNew(() => (this.DeserializeFromStream(type,readStream)));
return task;
} private object DeserializeFromStream(Type type,Stream readStream)
{
try
{
using (var reader = new StreamReader(readStream))
{
MethodInfo method = typeof(JSON).GetMethod("Deserialize", new Type[] { typeof(TextReader),typeof(Options) });
MethodInfo generic = method.MakeGenericMethod(type);
return generic.Invoke(this, new object[]{reader, _jilOptions});
}
}
catch
{
return null;
} } public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, TransportContext transportContext)
{
using (TextWriter streamWriter = new StreamWriter(writeStream))
{
JSON.Serialize(value, streamWriter, _jilOptions);
var task = Task.Factory.StartNew(() => writeStream);
return task;
}
}
}

This code uses reflection for deserialization of JSON.

Replace default JSON serializer

In the end, we need to remove default JSON serializer.

Place this code at beginning of WebApiConfig

config.Formatters.RemoveAt();
config.Formatters.Insert(, new JilFormatter());

最新文章

  1. MAVEN学习-第一个Maven项目的构建
  2. Appium+python的一个简单完整的用例
  3. NULL的陷阱:Merge
  4. Java自由块(静态和非静态)(转载)
  5. 子句jion
  6. TCP建立连接、断开连接以及正常报文的报头和报位的大小
  7. PostgreSQL Replication之第十四章 扩展与BDR
  8. &lt;转&gt;配置DNS辅助服务器:DNS系列之四
  9. ZOJ 2680 Clock()数学
  10. PostgreSQL 9.3 Streaming Replication 状态监控
  11. Struts(二十五):自定义验证器
  12. .Net Core WebAPI 搭建
  13. Linq组合查询与分页组合查询结合
  14. Android版本28使用http请求
  15. DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
  16. vue 自学笔记(6) axios的使用
  17. 4-(基础入门篇)学会刷Wi-Fi模块固件(刷AT指令固件)
  18. 【转】#ifdef __cplusplus+extern &quot;C&quot;的用法
  19. db2系统表相应功能
  20. git第六节---git 远程仓库

热门文章

  1. linux服务之udevd
  2. html之texteara
  3. ANDROID中获取STRING.XML,DIMENS.XML等资源文件中的值
  4. log4j日志的打印
  5. BouncyCastle产生一个PKCS#12规范的PFX/p12证书
  6. SSH_框架整合7--整个项目CODE
  7. FFTW简介及使用
  8. 使用Maven Profile实现多环境构建
  9. activiti自定义流程之整合(四):整合自定义表单部署流程定义
  10. IOS开发之自定义系统弹出键盘上方的view(转载)