using MemoryPack; using System.Net; namespace linker.messenger.serializer.memorypack { /// /// MemoryPack 的 IPAddress序列化扩展 /// public sealed class IPAddressFormatter : MemoryPackFormatter { public override void Serialize(ref MemoryPackWriter writer, scoped ref IPAddress value) { if (value == null) { writer.WriteNullCollectionHeader(); return; } //最多是IPV6 16字节+加头部4字节 Memory memory = new byte[20]; Span 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 span = Array.Empty(); reader.ReadSpan(ref span); int length = span[0]; value = new IPAddress(span.Slice(0 + 1, length)); } } }