Skip to content

Instantly share code, notes, and snippets.

@stevenguh
Created August 31, 2017 19:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stevenguh/7c10bbb16ed9d31897dc1b43c768005a to your computer and use it in GitHub Desktop.
Save stevenguh/7c10bbb16ed9d31897dc1b43c768005a to your computer and use it in GitHub Desktop.
NodaContractResolverBenchmarks
using System;
using BenchmarkDotNet.Attributes;
using Newtonsoft.Json;
using NodaTime.Serialization.JsonNet;
namespace NodaTime.Serialization.Benchmarks.JsonNet
{
[MemoryDiagnoser]
public class NodaContractResolverBenchmarks
{
static readonly Instant _instant = Instant.FromUtc(2017, 6, 7, 0, 0);
static readonly DateTime _dateTime = new DateTime(2017, 6, 7);
static readonly JsonSerializerSettings _settings = new JsonSerializerSettings();
static NodaContractResolverBenchmarks()
{
_settings.ContractResolver = new NodaJsonContractResolver(DateTimeZoneProviders.Tzdb);
_settings.DateParseHandling = DateParseHandling.None;
}
[Benchmark(Baseline = true)]
public void SerializeDateTimeWithoutSettings()
{
JsonConvert.SerializeObject(new { tm = _dateTime });
}
[Benchmark]
public void SerializeInstantWithoutSettings()
{
JsonConvert.SerializeObject(new { tm = _instant });
}
[Benchmark]
public void SerializeDateTimeWithSettings()
{
JsonConvert.SerializeObject(new { tm = _dateTime }, _settings);
}
[Benchmark]
public void SerializeInstantWithSettings()
{
JsonConvert.SerializeObject(new { tm = _instant }, _settings);
}
}
}
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace NodaTime.Serialization.JsonNet
{
public class NodaJsonContractResolver : DefaultContractResolver
{
JsonConverter _dateTimeZoneConverter;
JsonConverter _zonedDateTimeConverter;
public NodaJsonContractResolver(IDateTimeZoneProvider provider)
{
_dateTimeZoneConverter = NodaConverters.CreateDateTimeZoneConverter(provider);
_zonedDateTimeConverter = NodaConverters.CreateZonedDateTimeConverter(provider);
}
protected override JsonContract CreateContract(Type objectType)
{
JsonContract contract = base.CreateContract(objectType);
if (NodaConverters.InstantConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.InstantConverter;
}
else if (NodaConverters.IntervalConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.IntervalConverter;
}
else if (NodaConverters.LocalDateConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.LocalDateConverter;
}
else if (NodaConverters.LocalDateTimeConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.LocalDateTimeConverter;
}
else if (NodaConverters.LocalTimeConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.LocalTimeConverter;
}
else if (NodaConverters.OffsetConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.OffsetConverter;
}
else if (_dateTimeZoneConverter.CanConvert(objectType))
{
contract.Converter = _dateTimeZoneConverter;
}
else if (NodaConverters.DurationConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.DurationConverter;
}
else if (NodaConverters.RoundtripPeriodConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.RoundtripPeriodConverter;
}
else if (NodaConverters.OffsetDateTimeConverter.CanConvert(objectType))
{
contract.Converter = NodaConverters.OffsetDateTimeConverter;
}
else if (_zonedDateTimeConverter.CanConvert(objectType))
{
contract.Converter = _zonedDateTimeConverter;
}
return contract;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment