using System; using System.Collections.Generic; using System.Linq; using System.Net; namespace MessagePack.Formatters { /// /// Serialization of an array to and from . /// [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public class IPAddressArrayFormatter : IMessagePackFormatter { /// public IPAddress[] Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { if (reader.IsNil) return null; int bytePos = 0; byte[] bytes = options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options); byte[] buffer = bytes.Skip(bytePos).Take(sizeof(int)).ToArray(); bytePos += sizeof(int); Swap(buffer); int length = BitConverter.ToInt32(buffer, 0); int arrayPos = 0; var array = new IPAddress[length]; while (bytePos < bytes.Length) { byte len = bytes.Skip(bytePos).First(); bytePos++; buffer = bytes.Skip(bytePos).Take(len).ToArray(); bytePos += len; array[arrayPos] = new IPAddress(buffer); arrayPos++; } return array; } /// public void Serialize(ref MessagePackWriter writer, IPAddress[] value, MessagePackSerializerOptions options) { if (value == null) { writer.WriteNil(); return; } var bytes = new List(); int length = value.Length; byte[] buffer = BitConverter.GetBytes(length); Swap(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.ToArray(), options); } private void Swap(byte[] bytes) { if (BitConverter.IsLittleEndian) Array.Reverse(bytes); } } }