using DateTimeSerialization;
using MessagePack.Formatters;
using MessagePack.Resolvers;
using System.Collections.Generic;
namespace DateTimeSerialization
public class UtcNullableDateTimeFormatter : IMessagePackFormatter<DateTime?>
public void Serialize(ref MessagePackWriter writer, DateTime? value, MessagePackSerializerOptions options)
writer.Write(DateTime.SpecifyKind(value.Value, DateTimeKind.Utc));
public DateTime? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
return DateTime.SpecifyKind(reader.ReadDateTime(), DateTimeKind.Utc);
public class CustomResolver : IFormatterResolver
public static readonly CustomResolver Instance = new CustomResolver();
private CustomResolver() { }
public IMessagePackFormatter<T>? GetFormatter<T>()
if (typeof(T) == typeof(DateTime?))
return (IMessagePackFormatter<T>)new UtcNullableDateTimeFormatter();
return StandardResolver.Instance.GetFormatter<T>();
public DateTime? Date1 { get; set; }
public DateTime? Date2 { get; set; }
public DateTime? Date3 { get; set; }
public DateTime? Date4 { get; set; }
public DateTime? Date5 { get; set; }
public class SerializationHelper
public static byte[]? Serialize<T>(T obj)
var options = MessagePackSerializerOptions.Standard.WithResolver(CustomResolver.Instance);
return MessagePackSerializer.Serialize<T>(obj, options);
Console.WriteLine($"Serialization failed: {ex.Message}");
public static T? Deserialize<T>(byte[] data)
if (data == null || data.Length == 0)
Console.WriteLine("Data is null or empty.");
var options = MessagePackSerializerOptions.Standard.WithResolver(CustomResolver.Instance);
return MessagePackSerializer.Deserialize<T>(data, options);
Console.WriteLine($"Deserialization failed: {ex.Message}");
public static void Main(string[] args)
Console.WriteLine("-------------- STARTING UNIT TESTING ---------------");
new NUnitLite.AutoRun().Execute(["--noc" ]);
namespace DateTimeSerializationTests
public class SerializationHelperTests
public void Serialize_Deserialize_MyPoco_Success()
Date2 = DateTime.Now.AddDays(1),
Date3 = DateTime.Now.AddDays(2),
Date4 = DateTime.Now.AddDays(3),
byte[]? serializedData = SerializationHelper.Serialize(obj);
Assert.That(serializedData, Is.Not.Null);
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(serializedData);
Assert.That(deserializedObj, Is.Not.Null);
Assert.That(deserializedObj.Date1, Is.EqualTo(DateTime.SpecifyKind(obj.Date1.Value, DateTimeKind.Utc)).Within(1).Milliseconds);
Assert.That(deserializedObj.Date2, Is.EqualTo(DateTime.SpecifyKind(obj.Date2.Value, DateTimeKind.Utc)).Within(1).Milliseconds);
Assert.That(deserializedObj.Date3, Is.EqualTo(DateTime.SpecifyKind(obj.Date3.Value, DateTimeKind.Utc)).Within(1).Milliseconds);
Assert.That(deserializedObj.Date4, Is.EqualTo(DateTime.SpecifyKind(obj.Date4.Value, DateTimeKind.Utc)).Within(1).Milliseconds);
Assert.That(deserializedObj.Date5, Is.Null);
public void Serialize_Deserialize_MyPoco_AllNullDates_Success()
byte[]? serializedData = SerializationHelper.Serialize(obj);
Assert.That(serializedData, Is.Not.Null);
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(serializedData);
Assert.That(deserializedObj, Is.Not.Null);
Assert.That(deserializedObj.Date1, Is.Null);
Assert.That(deserializedObj.Date2, Is.Null);
Assert.That(deserializedObj.Date3, Is.Null);
Assert.That(deserializedObj.Date4, Is.Null);
Assert.That(deserializedObj.Date5, Is.Null);
public void Deserialize_NullData_ReturnsDefault()
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(null);
Assert.That(deserializedObj, Is.EqualTo(default(MyPoco)));
public void Deserialize_EmptyData_ReturnsDefault()
byte[] emptyData = new byte[0];
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(emptyData);
Assert.That(deserializedObj, Is.EqualTo(default(MyPoco)));
public void Serialize_Deserialize_DateTimeMinValue()
Date1 = DateTime.MinValue,
byte[]? serializedData = SerializationHelper.Serialize(obj);
Assert.That(serializedData, Is.Not.Null);
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(serializedData);
Assert.That(deserializedObj, Is.Not.Null);
Assert.That(deserializedObj.Date1, Is.EqualTo(DateTime.SpecifyKind(obj.Date1.Value, DateTimeKind.Utc)).Within(1).Milliseconds);
public void Serialize_Deserialize_DateTimeMaxValue()
Date1 = DateTime.MaxValue,
byte[]? serializedData = SerializationHelper.Serialize(obj);
Assert.That(serializedData, Is.Not.Null);
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(serializedData);
Assert.That(deserializedObj, Is.Not.Null);
Assert.That(deserializedObj.Date1, Is.EqualTo(DateTime.SpecifyKind(obj.Date1.Value, DateTimeKind.Utc)).Within(1).Milliseconds);