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)
Date2 = DateTime.Now.AddDays(1),
Date3 = DateTime.Now.AddDays(2),
Date4 = DateTime.Now.AddDays(3),
byte[]? serializedData = SerializationHelper.Serialize(obj);
if (serializedData != null)
MyPoco? deserializedObj = SerializationHelper.Deserialize<MyPoco>(serializedData);
if (deserializedObj != null)
Console.WriteLine($"Date1: {deserializedObj.Date1}");
Console.WriteLine($"Date2: {deserializedObj.Date2}");
Console.WriteLine($"Date3: {deserializedObj.Date3}");
Console.WriteLine($"Date4: {deserializedObj.Date4}");
Console.WriteLine($"Date5: {deserializedObj.Date5}");
Console.WriteLine("Deserialization failed.");
Console.WriteLine("Serialization failed.");