using System; using System.Collections.Generic; using System.Linq; using System.Net; using AMWD.Common.MessagePack.Utilities; namespace MessagePack.Formatters { /// /// Serialization of an list to and from . /// [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public class IPAddressListFormatter : IMessagePackFormatter> { /// public List Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.IsNil) return null; byte[] bytes = options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options); // skipping the length information int bytePos = sizeof(int); var list = new List(); while (bytePos < bytes.Length) { byte len = bytes.Skip(bytePos).First(); bytePos++; byte[] buffer = bytes.Skip(bytePos).Take(len).ToArray(); bytePos += len; list.Add(new IPAddress(buffer)); } return list; } /// public void Serialize(ref MessagePackWriter writer, List value, MessagePackSerializerOptions options) { if (value == null) { writer.WriteNil(); return; } var bytes = new List(); int length = value.Count; byte[] buffer = BitConverter.GetBytes(length); NetworkHelper.SwapBigEndian(buffer); bytes.AddRange(buffer); foreach (var ip in value) { buffer = ip.GetAddressBytes(); bytes.Add((byte)buffer.Length); bytes.AddRange(buffer); } options.Resolver.GetFormatterWithVerify().Serialize(ref writer, [.. bytes], options); } } }