時刻のみをシリアライズしたい
DateTimeをシリアライズするためのメソッドDateTime.ToBinary()がありますが、
DateTime型は日付が含まれるため、日付が必要ない場合に無駄になってしまいます。
(Hour以下のTicksの最大値は863,999,999,999なので5バイトで表現可能。
少なくとも今の私の仕事では8バイトと5バイトの差は大きいです)
時刻のみをシリアライズできるようなライブラリが見当たらなかったため、
とりあえず作ってみたものが以下になります。
class Program
{
static void Main()
{
var now = DateTime.UtcNow;
var bytes = TimeSerializer.Serialize(now);
var now2 = TimeSerializer.Deserialize(bytes, now.Date);
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
Console.WriteLine(now2.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
}
}
static class TimeSerializer
{
public static byte[] Serialize(DateTime time)
{
return Serialize((time - time.Date).Ticks);
}
public static byte[] Serialize(long ticks)
{
var bytes = BitConverter.GetBytes(ticks);
return bytes.Take(5).ToArray();
}
public static DateTime Deserialize(byte[] bytes, DateTime date)
{
return date.AddTicks(Deserialize(bytes));
}
public static long Deserialize(byte[] bytes)
{
var longBytes = new byte[8] { bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], 0, 0, 0 };
return BitConverter.ToInt64(longBytes, 0);
}
}
これよりマシな方法はありますか?
またはこういったことができるライブラリはありますか?