You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.2 KiB
71 lines
2.2 KiB
4 years ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace MessagePack.Formatters
|
||
|
{
|
||
|
public sealed class NullableFormatter<T> : IMessagePackFormatter<T?>
|
||
|
where T : struct
|
||
|
{
|
||
|
public int Serialize(ref byte[] bytes, int offset, T? value, IFormatterResolver formatterResolver)
|
||
|
{
|
||
|
if (value == null)
|
||
|
{
|
||
|
return MessagePackBinary.WriteNil(ref bytes, offset);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return formatterResolver.GetFormatterWithVerify<T>().Serialize(ref bytes, offset, value.Value, formatterResolver);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public T? Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize)
|
||
|
{
|
||
|
if (MessagePackBinary.IsNil(bytes, offset))
|
||
|
{
|
||
|
readSize = 1;
|
||
|
return null;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return formatterResolver.GetFormatterWithVerify<T>().Deserialize(bytes, offset, formatterResolver, out readSize);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public sealed class StaticNullableFormatter<T> : IMessagePackFormatter<T?>
|
||
|
where T : struct
|
||
|
{
|
||
|
readonly IMessagePackFormatter<T> underlyingFormatter;
|
||
|
|
||
|
public StaticNullableFormatter(IMessagePackFormatter<T> underlyingFormatter)
|
||
|
{
|
||
|
this.underlyingFormatter = underlyingFormatter;
|
||
|
}
|
||
|
|
||
|
public int Serialize(ref byte[] bytes, int offset, T? value, IFormatterResolver formatterResolver)
|
||
|
{
|
||
|
if (value == null)
|
||
|
{
|
||
|
return MessagePackBinary.WriteNil(ref bytes, offset);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return underlyingFormatter.Serialize(ref bytes, offset, value.Value, formatterResolver);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public T? Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize)
|
||
|
{
|
||
|
if (MessagePackBinary.IsNil(bytes, offset))
|
||
|
{
|
||
|
readSize = 1;
|
||
|
return null;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return underlyingFormatter.Deserialize(bytes, offset, formatterResolver, out readSize);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|