mirror of
https://github.com/snltty/linker.git
synced 2025-10-08 18:40:07 +08:00
48 lines
1.4 KiB
C#
48 lines
1.4 KiB
C#
using MemoryPack;
|
|
using System.Net;
|
|
|
|
namespace linker.messenger.serializer.memorypack
|
|
{
|
|
/// <summary>
|
|
/// MemoryPack 的 IPAddress序列化扩展
|
|
/// </summary>
|
|
public sealed class IPAddressFormatter : MemoryPackFormatter<IPAddress>
|
|
{
|
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref IPAddress value)
|
|
{
|
|
if (value == null)
|
|
{
|
|
writer.WriteNullCollectionHeader();
|
|
return;
|
|
}
|
|
|
|
//最多是IPV6 16字节+加头部4字节
|
|
Memory<byte> memory = new byte[20];
|
|
Span<byte> span = memory.Span;
|
|
|
|
value.TryWriteBytes(span.Slice(1), out int bytesWritten);
|
|
|
|
span[0] = (byte)bytesWritten;
|
|
|
|
writer.WriteCollectionHeader(bytesWritten + 4);
|
|
writer.WriteSpan(span.Slice(0, bytesWritten + 1));
|
|
}
|
|
|
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref IPAddress value)
|
|
{
|
|
if (!reader.TryReadCollectionHeader(out int len))
|
|
{
|
|
value = null;
|
|
return;
|
|
}
|
|
|
|
|
|
Span<byte> span = Array.Empty<byte>();
|
|
reader.ReadSpan(ref span);
|
|
|
|
int length = span[0];
|
|
value = new IPAddress(span.Slice(0 + 1, length));
|
|
}
|
|
}
|
|
}
|