在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 MediaTypeFormatterFirst, 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 serializerIn the end, we need to remove default JSON serializer. Place this code at beginning of WebApiConfig config.Formatters.RemoveAt(0); config.Formatters.Insert(0, new JilFormatter());
|
请发表评论