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.
151 lines
6.8 KiB
151 lines
6.8 KiB
1 year ago
|
using MessagePack.Formatters;
|
||
|
using MessagePack.Internal;
|
||
|
using MessagePack.Resolvers;
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Reflection;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace MessagePack.Resolvers
|
||
|
{
|
||
|
public sealed class BuiltinResolver : IFormatterResolver
|
||
|
{
|
||
|
public static readonly IFormatterResolver Instance = new BuiltinResolver();
|
||
|
|
||
|
BuiltinResolver()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public IMessagePackFormatter<T> GetFormatter<T>()
|
||
|
{
|
||
|
return FormatterCache<T>.formatter;
|
||
|
}
|
||
|
|
||
|
static class FormatterCache<T>
|
||
|
{
|
||
|
public static readonly IMessagePackFormatter<T> formatter;
|
||
|
|
||
|
static FormatterCache()
|
||
|
{
|
||
|
// Reduce IL2CPP code generate size(don't write long code in <T>)
|
||
|
formatter = (IMessagePackFormatter<T>)BuiltinResolverGetFormatterHelper.GetFormatter(typeof(T));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
namespace MessagePack.Internal
|
||
|
{
|
||
|
internal static class BuiltinResolverGetFormatterHelper
|
||
|
{
|
||
|
static readonly Dictionary<Type, object> formatterMap = new Dictionary<Type, object>()
|
||
|
{
|
||
|
// Primitive
|
||
|
{typeof(Int16), Int16Formatter.Instance},
|
||
|
{typeof(Int32), Int32Formatter.Instance},
|
||
|
{typeof(Int64), Int64Formatter.Instance},
|
||
|
{typeof(UInt16), UInt16Formatter.Instance},
|
||
|
{typeof(UInt32), UInt32Formatter.Instance},
|
||
|
{typeof(UInt64), UInt64Formatter.Instance},
|
||
|
{typeof(Single), SingleFormatter.Instance},
|
||
|
{typeof(Double), DoubleFormatter.Instance},
|
||
|
{typeof(bool), BooleanFormatter.Instance},
|
||
|
{typeof(byte), ByteFormatter.Instance},
|
||
|
{typeof(sbyte), SByteFormatter.Instance},
|
||
|
{typeof(DateTime), DateTimeFormatter.Instance},
|
||
|
{typeof(char), CharFormatter.Instance},
|
||
|
|
||
|
// Nulllable Primitive
|
||
|
{typeof(Nullable<Int16>), NullableInt16Formatter.Instance},
|
||
|
{typeof(Nullable<Int32>), NullableInt32Formatter.Instance},
|
||
|
{typeof(Nullable<Int64>), NullableInt64Formatter.Instance},
|
||
|
{typeof(Nullable<UInt16>), NullableUInt16Formatter.Instance},
|
||
|
{typeof(Nullable<UInt32>), NullableUInt32Formatter.Instance},
|
||
|
{typeof(Nullable<UInt64>), NullableUInt64Formatter.Instance},
|
||
|
{typeof(Nullable<Single>), NullableSingleFormatter.Instance},
|
||
|
{typeof(Nullable<Double>), NullableDoubleFormatter.Instance},
|
||
|
{typeof(Nullable<bool>), NullableBooleanFormatter.Instance},
|
||
|
{typeof(Nullable<byte>), NullableByteFormatter.Instance},
|
||
|
{typeof(Nullable<sbyte>), NullableSByteFormatter.Instance},
|
||
|
{typeof(Nullable<DateTime>), NullableDateTimeFormatter.Instance},
|
||
|
{typeof(Nullable<char>), NullableCharFormatter.Instance},
|
||
|
|
||
|
// StandardClassLibraryFormatter
|
||
|
{typeof(string), NullableStringFormatter.Instance},
|
||
|
{typeof(decimal), DecimalFormatter.Instance},
|
||
|
{typeof(decimal?), new StaticNullableFormatter<decimal>(DecimalFormatter.Instance)},
|
||
|
{typeof(TimeSpan), TimeSpanFormatter.Instance},
|
||
|
{typeof(TimeSpan?), new StaticNullableFormatter<TimeSpan>(TimeSpanFormatter.Instance)},
|
||
|
{typeof(DateTimeOffset), DateTimeOffsetFormatter.Instance},
|
||
|
{typeof(DateTimeOffset?), new StaticNullableFormatter<DateTimeOffset>(DateTimeOffsetFormatter.Instance)},
|
||
|
{typeof(Guid), GuidFormatter.Instance},
|
||
|
{typeof(Guid?), new StaticNullableFormatter<Guid>(GuidFormatter.Instance)},
|
||
|
{typeof(Uri), UriFormatter.Instance},
|
||
|
{typeof(Version), VersionFormatter.Instance},
|
||
|
{typeof(StringBuilder), StringBuilderFormatter.Instance},
|
||
|
{typeof(BitArray), BitArrayFormatter.Instance},
|
||
|
|
||
|
// special primitive
|
||
|
{typeof(byte[]), ByteArrayFormatter.Instance},
|
||
|
|
||
|
// Nil
|
||
|
{typeof(Nil), NilFormatter.Instance},
|
||
|
{typeof(Nil?), NullableNilFormatter.Instance},
|
||
|
|
||
|
// otpmitized primitive array formatter
|
||
|
{typeof(Int16[]), Int16ArrayFormatter.Instance},
|
||
|
{typeof(Int32[]), Int32ArrayFormatter.Instance},
|
||
|
{typeof(Int64[]), Int64ArrayFormatter.Instance},
|
||
|
{typeof(UInt16[]), UInt16ArrayFormatter.Instance},
|
||
|
{typeof(UInt32[]), UInt32ArrayFormatter.Instance},
|
||
|
{typeof(UInt64[]), UInt64ArrayFormatter.Instance},
|
||
|
{typeof(Single[]), SingleArrayFormatter.Instance},
|
||
|
{typeof(Double[]), DoubleArrayFormatter.Instance},
|
||
|
{typeof(Boolean[]), BooleanArrayFormatter.Instance},
|
||
|
{typeof(SByte[]), SByteArrayFormatter.Instance},
|
||
|
{typeof(DateTime[]), DateTimeArrayFormatter.Instance},
|
||
|
{typeof(Char[]), CharArrayFormatter.Instance},
|
||
|
{typeof(string[]), NullableStringArrayFormatter.Instance},
|
||
|
|
||
|
// well known collections
|
||
|
{typeof(List<Int16>), new ListFormatter<Int16>()},
|
||
|
{typeof(List<Int32>), new ListFormatter<Int32>()},
|
||
|
{typeof(List<Int64>), new ListFormatter<Int64>()},
|
||
|
{typeof(List<UInt16>), new ListFormatter<UInt16>()},
|
||
|
{typeof(List<UInt32>), new ListFormatter<UInt32>()},
|
||
|
{typeof(List<UInt64>), new ListFormatter<UInt64>()},
|
||
|
{typeof(List<Single>), new ListFormatter<Single>()},
|
||
|
{typeof(List<Double>), new ListFormatter<Double>()},
|
||
|
{typeof(List<Boolean>), new ListFormatter<Boolean>()},
|
||
|
{typeof(List<byte>), new ListFormatter<byte>()},
|
||
|
{typeof(List<SByte>), new ListFormatter<SByte>()},
|
||
|
{typeof(List<DateTime>), new ListFormatter<DateTime>()},
|
||
|
{typeof(List<Char>), new ListFormatter<Char>()},
|
||
|
{typeof(List<string>), new ListFormatter<string>()},
|
||
|
|
||
|
{ typeof(ArraySegment<byte>), ByteArraySegmentFormatter.Instance },
|
||
|
{ typeof(ArraySegment<byte>?),new StaticNullableFormatter<ArraySegment<byte>>(ByteArraySegmentFormatter.Instance) },
|
||
|
|
||
|
#if NETSTANDARD1_4
|
||
|
{typeof(System.Numerics.BigInteger), BigIntegerFormatter.Instance},
|
||
|
{typeof(System.Numerics.BigInteger?), new StaticNullableFormatter<System.Numerics.BigInteger>(BigIntegerFormatter.Instance)},
|
||
|
{typeof(System.Numerics.Complex), ComplexFormatter.Instance},
|
||
|
{typeof(System.Numerics.Complex?), new StaticNullableFormatter<System.Numerics.Complex>(ComplexFormatter.Instance)},
|
||
|
{typeof(System.Threading.Tasks.Task), TaskUnitFormatter.Instance},
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
internal static object GetFormatter(Type t)
|
||
|
{
|
||
|
object formatter;
|
||
|
if (formatterMap.TryGetValue(t, out formatter))
|
||
|
{
|
||
|
return formatter;
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
}
|