Adding IPNetwork to Converter/Formatters
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using AMWD.Common.Utilities;
|
||||
|
||||
namespace MessagePack.Formatters
|
||||
{
|
||||
@@ -22,7 +23,7 @@ namespace MessagePack.Formatters
|
||||
byte[] buffer = bytes.Skip(bytePos).Take(sizeof(int)).ToArray();
|
||||
bytePos += sizeof(int);
|
||||
|
||||
Swap(buffer);
|
||||
NetworkHelper.SwapBigEndian(buffer);
|
||||
int length = BitConverter.ToInt32(buffer, 0);
|
||||
|
||||
int arrayPos = 0;
|
||||
@@ -55,7 +56,7 @@ namespace MessagePack.Formatters
|
||||
|
||||
int length = value.Length;
|
||||
byte[] buffer = BitConverter.GetBytes(length);
|
||||
Swap(buffer);
|
||||
NetworkHelper.SwapBigEndian(buffer);
|
||||
bytes.AddRange(buffer);
|
||||
|
||||
foreach (var ip in value)
|
||||
@@ -67,11 +68,5 @@ namespace MessagePack.Formatters
|
||||
|
||||
options.Resolver.GetFormatterWithVerify<byte[]>().Serialize(ref writer, bytes.ToArray(), options);
|
||||
}
|
||||
|
||||
private void Swap(byte[] bytes)
|
||||
{
|
||||
if (BitConverter.IsLittleEndian)
|
||||
Array.Reverse(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using AMWD.Common.Utilities;
|
||||
|
||||
namespace MessagePack.Formatters
|
||||
{
|
||||
@@ -50,7 +51,7 @@ namespace MessagePack.Formatters
|
||||
|
||||
int length = value.Count;
|
||||
byte[] buffer = BitConverter.GetBytes(length);
|
||||
Swap(buffer);
|
||||
NetworkHelper.SwapBigEndian(buffer);
|
||||
bytes.AddRange(buffer);
|
||||
|
||||
foreach (var ip in value)
|
||||
@@ -62,11 +63,5 @@ namespace MessagePack.Formatters
|
||||
|
||||
options.Resolver.GetFormatterWithVerify<byte[]>().Serialize(ref writer, bytes.ToArray(), options);
|
||||
}
|
||||
|
||||
private void Swap(byte[] bytes)
|
||||
{
|
||||
if (BitConverter.IsLittleEndian)
|
||||
Array.Reverse(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
74
AMWD.Common/Formatters/IPNetworkArrayFormatter.cs
Normal file
74
AMWD.Common/Formatters/IPNetworkArrayFormatter.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using AMWD.Common.Utilities;
|
||||
using MessagePack;
|
||||
using MessagePack.Formatters;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
|
||||
namespace AMWD.Common.Formatters
|
||||
{
|
||||
/// <summary>
|
||||
/// Serialization of an <see cref="IPNetwork"/> array to and from <see cref="MessagePack"/>.
|
||||
/// </summary>
|
||||
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
|
||||
public class IPNetworkArrayFormatter : IMessagePackFormatter<IPNetwork[]>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public IPNetwork[] Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
|
||||
{
|
||||
if (reader.IsNil)
|
||||
return null;
|
||||
|
||||
int bytePos = 0;
|
||||
byte[] bytes = options.Resolver.GetFormatterWithVerify<byte[]>().Deserialize(ref reader, options);
|
||||
byte[] buffer = bytes.Skip(bytePos).Take(sizeof(int)).ToArray();
|
||||
bytePos += sizeof(int);
|
||||
|
||||
NetworkHelper.SwapBigEndian(buffer);
|
||||
int length = BitConverter.ToInt32(buffer, 0);
|
||||
|
||||
int arrayPos = 0;
|
||||
var array = new IPNetwork[length];
|
||||
while (bytePos < bytes.Length)
|
||||
{
|
||||
byte len = bytes.Skip(bytePos).First();
|
||||
bytePos++;
|
||||
|
||||
buffer = bytes.Skip(bytePos).Take(len).ToArray();
|
||||
bytePos += len;
|
||||
|
||||
array[arrayPos] = IPNetworkFormatter.DeserializeInternal(buffer);
|
||||
arrayPos++;
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Serialize(ref MessagePackWriter writer, IPNetwork[] value, MessagePackSerializerOptions options)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
writer.WriteNil();
|
||||
return;
|
||||
}
|
||||
|
||||
var bytes = new List<byte>();
|
||||
|
||||
int length = value.Length;
|
||||
byte[] buffer = BitConverter.GetBytes(length);
|
||||
NetworkHelper.SwapBigEndian(buffer);
|
||||
bytes.AddRange(buffer);
|
||||
|
||||
foreach (var network in value)
|
||||
{
|
||||
buffer = IPNetworkFormatter.SerializeInternal(network);
|
||||
bytes.Add((byte)buffer.Length);
|
||||
bytes.AddRange(buffer);
|
||||
}
|
||||
|
||||
options.Resolver.GetFormatterWithVerify<byte[]>().Serialize(ref writer, bytes.ToArray(), options);
|
||||
}
|
||||
}
|
||||
}
|
||||
59
AMWD.Common/Formatters/IPNetworkFormatter.cs
Normal file
59
AMWD.Common/Formatters/IPNetworkFormatter.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
|
||||
namespace MessagePack.Formatters
|
||||
{
|
||||
/// <summary>
|
||||
/// Serialization of an <see cref="IPNetwork"/> to and from <see cref="MessagePack"/>.
|
||||
/// </summary>
|
||||
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
|
||||
public class IPNetworkFormatter : IMessagePackFormatter<IPNetwork>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public IPNetwork Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
|
||||
{
|
||||
if (reader.IsNil)
|
||||
return null;
|
||||
|
||||
byte[] bytes = options.Resolver.GetFormatterWithVerify<byte[]>().Deserialize(ref reader, options);
|
||||
return DeserializeInternal(bytes);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Serialize(ref MessagePackWriter writer, IPNetwork value, MessagePackSerializerOptions options)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
writer.WriteNil();
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] bytes = SerializeInternal(value);
|
||||
options.Resolver.GetFormatterWithVerify<byte[]>().Serialize(ref writer, bytes, options);
|
||||
}
|
||||
|
||||
internal static byte[] SerializeInternal(IPNetwork network)
|
||||
{
|
||||
// IP network prefix has a maximum of 128 bit - therefore the length can be covered with a byte.
|
||||
byte prefixLength = (byte)network.PrefixLength;
|
||||
byte[] prefixBytes = network.Prefix.GetAddressBytes();
|
||||
|
||||
byte[] bytes = new byte[prefixBytes.Length + 1];
|
||||
bytes[0] = prefixLength;
|
||||
Array.Copy(prefixBytes, 0, bytes, 1, prefixBytes.Length);
|
||||
|
||||
return bytes;
|
||||
}
|
||||
|
||||
internal static IPNetwork DeserializeInternal(byte[] bytes)
|
||||
{
|
||||
byte prefixLength = bytes[0];
|
||||
byte[] prefixBytes = bytes.Skip(1).ToArray();
|
||||
|
||||
var prefix = new IPAddress(prefixBytes);
|
||||
return new IPNetwork(prefix, prefixLength);
|
||||
}
|
||||
}
|
||||
}
|
||||
67
AMWD.Common/Formatters/IPNetworkListFormatter.cs
Normal file
67
AMWD.Common/Formatters/IPNetworkListFormatter.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using AMWD.Common.Utilities;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
|
||||
namespace MessagePack.Formatters
|
||||
{
|
||||
/// <summary>
|
||||
/// Serialization of an <see cref="IPNetwork"/> list to and from <see cref="MessagePack"/>.
|
||||
/// </summary>
|
||||
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
|
||||
public class IPNetworkListFormatter : IMessagePackFormatter<List<IPNetwork>>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public List<IPNetwork> Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options)
|
||||
{
|
||||
if (reader.IsNil)
|
||||
return null;
|
||||
|
||||
byte[] bytes = options.Resolver.GetFormatterWithVerify<byte[]>().Deserialize(ref reader, options);
|
||||
|
||||
// skipping the length information
|
||||
int bytePos = sizeof(int);
|
||||
|
||||
var list = new List<IPNetwork>();
|
||||
while (bytePos < bytes.Length)
|
||||
{
|
||||
byte len = bytes.Skip(bytePos).First();
|
||||
bytePos++;
|
||||
|
||||
byte[] buffer = bytes.Skip(bytePos).Take(len).ToArray();
|
||||
bytePos += len;
|
||||
|
||||
list.Add(IPNetworkFormatter.DeserializeInternal(buffer));
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Serialize(ref MessagePackWriter writer, List<IPNetwork> value, MessagePackSerializerOptions options)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
writer.WriteNil();
|
||||
return;
|
||||
}
|
||||
|
||||
var bytes = new List<byte>();
|
||||
|
||||
int length = value.Count;
|
||||
byte[] buffer = BitConverter.GetBytes(length);
|
||||
NetworkHelper.SwapBigEndian(buffer);
|
||||
bytes.AddRange(buffer);
|
||||
|
||||
foreach (var network in value)
|
||||
{
|
||||
buffer = IPNetworkFormatter.SerializeInternal(network);
|
||||
bytes.Add((byte)buffer.Length);
|
||||
bytes.AddRange(buffer);
|
||||
}
|
||||
|
||||
options.Resolver.GetFormatterWithVerify<byte[]>().Serialize(ref writer, bytes.ToArray(), options);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user