-
Notifications
You must be signed in to change notification settings - Fork 58
/
UlidMessagePackFormatter.cs
69 lines (59 loc) · 1.94 KB
/
UlidMessagePackFormatter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using MessagePack;
using System.Buffers;
using MessagePack.Formatters;
using System;
namespace Cysharp.Serialization.MessagePack
{
public class UlidMessagePackFormatter : IMessagePackFormatter<Ulid>
{
public Ulid Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
{
var bin = reader.ReadBytes();
if (bin == null)
{
throw new MessagePackSerializationException(string.Format("Unexpected msgpack code {0} ({1}) encountered.", MessagePackCode.Nil, MessagePackCode.ToFormatName(MessagePackCode.Nil)));
}
var seq = bin.Value;
if (seq.IsSingleSegment)
{
return new Ulid(seq.First.Span);
}
else
{
Span<byte> buf = stackalloc byte[16];
seq.CopyTo(buf);
return new Ulid(buf);
}
}
public void Serialize(ref MessagePackWriter writer, Ulid value, MessagePackSerializerOptions options)
{
const int Length = 16;
writer.WriteBinHeader(Length);
var buffer = writer.GetSpan(Length);
value.TryWriteBytes(buffer);
writer.Advance(Length);
}
}
public class UlidMessagePackResolver : IFormatterResolver
{
public static IFormatterResolver Instance = new UlidMessagePackResolver();
UlidMessagePackResolver()
{
}
public IMessagePackFormatter<T> GetFormatter<T>()
{
return Cache<T>.formatter;
}
static class Cache<T>
{
public static readonly IMessagePackFormatter<T> formatter;
static Cache()
{
if (typeof(T) == typeof(Ulid))
{
formatter = (IMessagePackFormatter<T>)(object)new UlidMessagePackFormatter();
}
}
}
}
}