CoreNrbfSerializer
Core NRBF serializer. Supports common .NET types.
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Formats.Nrbf;
using System.IO;
using System.Private.Windows.BinaryFormat;
using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Text;
namespace System.Private.Windows.Nrbf
{
[NullableContext(1)]
[Nullable(0)]
internal class CoreNrbfSerializer : INrbfSerializer
{
[Nullable(new byte[] {
2,
1,
1
})]
private static Dictionary<TypeName, Type> s_knownTypes;
public static bool TryWriteObject(Stream stream, object value)
{
if (!BinaryFormatWriter.TryWriteFrameworkObject(stream, value) && !BinaryFormatWriter.TryWriteJsonData(stream, value))
return BinaryFormatWriter.TryWriteDrawingPrimitivesObject(stream, value);
return true;
}
bool INrbfSerializer.TryWriteObject(Stream stream, object value)
{
return this.TryWriteObject(stream, value);
}
public static bool TryGetObject(SerializationRecord record, [Nullable(2)] [NotNullWhen(true)] out object value)
{
if (!record.TryGetFrameworkObject(out value))
return record.TryGetDrawingPrimitivesObject(out value);
return true;
}
bool INrbfSerializer.TryGetObject(SerializationRecord record, [Nullable(2)] [NotNullWhen(true)] out object value)
{
return this.TryGetObject(record, out value);
}
public static bool TryBindToType(TypeName typeName, [Nullable(2)] [NotNullWhen(true)] out Type type)
{
if (s_knownTypes == null) {
Dictionary<TypeName, Type> obj = new Dictionary<TypeName, Type>(60, TypeNameComparer.FullNameMatch) {
{
TypeName.Parse("System.Byte".AsSpan(), null),
typeof(byte)
},
{
TypeName.Parse("System.SByte".AsSpan(), null),
typeof(sbyte)
},
{
TypeName.Parse("System.Int16".AsSpan(), null),
typeof(short)
},
{
TypeName.Parse("System.UInt16".AsSpan(), null),
typeof(ushort)
},
{
TypeName.Parse("System.Int32".AsSpan(), null),
typeof(int)
},
{
TypeName.Parse("System.UInt32".AsSpan(), null),
typeof(uint)
},
{
TypeName.Parse("System.Int64".AsSpan(), null),
typeof(long)
},
{
TypeName.Parse("System.UInt64".AsSpan(), null),
typeof(ulong)
},
{
TypeName.Parse("System.Double".AsSpan(), null),
typeof(double)
},
{
TypeName.Parse("System.Single".AsSpan(), null),
typeof(float)
},
{
TypeName.Parse("System.Char".AsSpan(), null),
typeof(char)
},
{
TypeName.Parse("System.Boolean".AsSpan(), null),
typeof(bool)
},
{
TypeName.Parse("System.String".AsSpan(), null),
typeof(string)
},
{
TypeName.Parse("System.Decimal".AsSpan(), null),
typeof(decimal)
},
{
TypeName.Parse("System.DateTime".AsSpan(), null),
typeof(DateTime)
},
{
TypeName.Parse("System.TimeSpan".AsSpan(), null),
typeof(TimeSpan)
},
{
TypeName.Parse("System.IntPtr".AsSpan(), null),
typeof(IntPtr)
},
{
TypeName.Parse("System.UIntPtr".AsSpan(), null),
typeof(UIntPtr)
},
{
TypeName.Parse("System.NotSupportedException".AsSpan(), null),
typeof(NotSupportedException)
}
};
System.Text.ValueStringBuilder builder = new System.Text.ValueStringBuilder(4, 2);
builder.AppendFormatted("System.Collections.Generic.List`1");
builder.AppendLiteral("[[");
builder.AppendFormatted("System.Boolean");
builder.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder), typeof(List<bool>));
System.Text.ValueStringBuilder builder2 = new System.Text.ValueStringBuilder(4, 2);
builder2.AppendFormatted("System.Collections.Generic.List`1");
builder2.AppendLiteral("[[");
builder2.AppendFormatted("System.Char");
builder2.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder2), typeof(List<char>));
System.Text.ValueStringBuilder builder3 = new System.Text.ValueStringBuilder(4, 2);
builder3.AppendFormatted("System.Collections.Generic.List`1");
builder3.AppendLiteral("[[");
builder3.AppendFormatted("System.String");
builder3.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder3), typeof(List<string>));
System.Text.ValueStringBuilder builder4 = new System.Text.ValueStringBuilder(4, 2);
builder4.AppendFormatted("System.Collections.Generic.List`1");
builder4.AppendLiteral("[[");
builder4.AppendFormatted("System.SByte");
builder4.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder4), typeof(List<sbyte>));
System.Text.ValueStringBuilder builder5 = new System.Text.ValueStringBuilder(4, 2);
builder5.AppendFormatted("System.Collections.Generic.List`1");
builder5.AppendLiteral("[[");
builder5.AppendFormatted("System.Byte");
builder5.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder5), typeof(List<byte>));
System.Text.ValueStringBuilder builder6 = new System.Text.ValueStringBuilder(4, 2);
builder6.AppendFormatted("System.Collections.Generic.List`1");
builder6.AppendLiteral("[[");
builder6.AppendFormatted("System.Int16");
builder6.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder6), typeof(List<short>));
System.Text.ValueStringBuilder builder7 = new System.Text.ValueStringBuilder(4, 2);
builder7.AppendFormatted("System.Collections.Generic.List`1");
builder7.AppendLiteral("[[");
builder7.AppendFormatted("System.UInt16");
builder7.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder7), typeof(List<ushort>));
System.Text.ValueStringBuilder builder8 = new System.Text.ValueStringBuilder(4, 2);
builder8.AppendFormatted("System.Collections.Generic.List`1");
builder8.AppendLiteral("[[");
builder8.AppendFormatted("System.Int32");
builder8.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder8), typeof(List<int>));
System.Text.ValueStringBuilder builder9 = new System.Text.ValueStringBuilder(4, 2);
builder9.AppendFormatted("System.Collections.Generic.List`1");
builder9.AppendLiteral("[[");
builder9.AppendFormatted("System.UInt32");
builder9.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder9), typeof(List<uint>));
System.Text.ValueStringBuilder builder10 = new System.Text.ValueStringBuilder(4, 2);
builder10.AppendFormatted("System.Collections.Generic.List`1");
builder10.AppendLiteral("[[");
builder10.AppendFormatted("System.Int64");
builder10.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder10), typeof(List<long>));
System.Text.ValueStringBuilder builder11 = new System.Text.ValueStringBuilder(4, 2);
builder11.AppendFormatted("System.Collections.Generic.List`1");
builder11.AppendLiteral("[[");
builder11.AppendFormatted("System.UInt64");
builder11.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder11), typeof(List<ulong>));
System.Text.ValueStringBuilder builder12 = new System.Text.ValueStringBuilder(4, 2);
builder12.AppendFormatted("System.Collections.Generic.List`1");
builder12.AppendLiteral("[[");
builder12.AppendFormatted("System.Single");
builder12.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder12), typeof(List<float>));
System.Text.ValueStringBuilder builder13 = new System.Text.ValueStringBuilder(4, 2);
builder13.AppendFormatted("System.Collections.Generic.List`1");
builder13.AppendLiteral("[[");
builder13.AppendFormatted("System.Double");
builder13.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder13), typeof(List<double>));
System.Text.ValueStringBuilder builder14 = new System.Text.ValueStringBuilder(4, 2);
builder14.AppendFormatted("System.Collections.Generic.List`1");
builder14.AppendLiteral("[[");
builder14.AppendFormatted("System.Decimal");
builder14.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder14), typeof(List<decimal>));
System.Text.ValueStringBuilder builder15 = new System.Text.ValueStringBuilder(4, 2);
builder15.AppendFormatted("System.Collections.Generic.List`1");
builder15.AppendLiteral("[[");
builder15.AppendFormatted("System.DateTime");
builder15.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder15), typeof(List<DateTime>));
System.Text.ValueStringBuilder builder16 = new System.Text.ValueStringBuilder(4, 2);
builder16.AppendFormatted("System.Collections.Generic.List`1");
builder16.AppendLiteral("[[");
builder16.AppendFormatted("System.TimeSpan");
builder16.AppendLiteral("]]");
obj.Add(Types.ToTypeName(ref builder16), typeof(List<TimeSpan>));
System.Text.ValueStringBuilder builder17 = new System.Text.ValueStringBuilder(2, 1);
builder17.AppendFormatted("System.Byte");
builder17.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder17), typeof(byte[]));
System.Text.ValueStringBuilder builder18 = new System.Text.ValueStringBuilder(2, 1);
builder18.AppendFormatted("System.SByte");
builder18.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder18), typeof(sbyte[]));
System.Text.ValueStringBuilder builder19 = new System.Text.ValueStringBuilder(2, 1);
builder19.AppendFormatted("System.Int16");
builder19.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder19), typeof(short[]));
System.Text.ValueStringBuilder builder20 = new System.Text.ValueStringBuilder(2, 1);
builder20.AppendFormatted("System.UInt16");
builder20.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder20), typeof(ushort[]));
System.Text.ValueStringBuilder builder21 = new System.Text.ValueStringBuilder(2, 1);
builder21.AppendFormatted("System.Int32");
builder21.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder21), typeof(int[]));
System.Text.ValueStringBuilder builder22 = new System.Text.ValueStringBuilder(2, 1);
builder22.AppendFormatted("System.UInt32");
builder22.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder22), typeof(uint[]));
System.Text.ValueStringBuilder builder23 = new System.Text.ValueStringBuilder(2, 1);
builder23.AppendFormatted("System.Int64");
builder23.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder23), typeof(long[]));
System.Text.ValueStringBuilder builder24 = new System.Text.ValueStringBuilder(2, 1);
builder24.AppendFormatted("System.UInt64");
builder24.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder24), typeof(ulong[]));
System.Text.ValueStringBuilder builder25 = new System.Text.ValueStringBuilder(2, 1);
builder25.AppendFormatted("System.Single");
builder25.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder25), typeof(float[]));
System.Text.ValueStringBuilder builder26 = new System.Text.ValueStringBuilder(2, 1);
builder26.AppendFormatted("System.Double");
builder26.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder26), typeof(double[]));
System.Text.ValueStringBuilder builder27 = new System.Text.ValueStringBuilder(2, 1);
builder27.AppendFormatted("System.Char");
builder27.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder27), typeof(char[]));
System.Text.ValueStringBuilder builder28 = new System.Text.ValueStringBuilder(2, 1);
builder28.AppendFormatted("System.Boolean");
builder28.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder28), typeof(bool[]));
System.Text.ValueStringBuilder builder29 = new System.Text.ValueStringBuilder(2, 1);
builder29.AppendFormatted("System.String");
builder29.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder29), typeof(string[]));
System.Text.ValueStringBuilder builder30 = new System.Text.ValueStringBuilder(2, 1);
builder30.AppendFormatted("System.Decimal");
builder30.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder30), typeof(decimal[]));
System.Text.ValueStringBuilder builder31 = new System.Text.ValueStringBuilder(2, 1);
builder31.AppendFormatted("System.DateTime");
builder31.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder31), typeof(DateTime[]));
System.Text.ValueStringBuilder builder32 = new System.Text.ValueStringBuilder(2, 1);
builder32.AppendFormatted("System.TimeSpan");
builder32.AppendLiteral("[]");
obj.Add(Types.ToTypeName(ref builder32), typeof(TimeSpan[]));
System.Text.ValueStringBuilder builder33 = new System.Text.ValueStringBuilder(0, 1);
builder33.AppendFormatted("System.Drawing.RectangleF");
obj.Add(Types.ToTypeName(ref builder33), typeof(RectangleF));
System.Text.ValueStringBuilder builder34 = new System.Text.ValueStringBuilder(0, 1);
builder34.AppendFormatted("System.Drawing.PointF");
obj.Add(Types.ToTypeName(ref builder34), typeof(PointF));
System.Text.ValueStringBuilder builder35 = new System.Text.ValueStringBuilder(0, 1);
builder35.AppendFormatted("System.Drawing.SizeF");
obj.Add(Types.ToTypeName(ref builder35), typeof(SizeF));
System.Text.ValueStringBuilder builder36 = new System.Text.ValueStringBuilder(0, 1);
builder36.AppendFormatted("System.Drawing.Rectangle");
obj.Add(Types.ToTypeName(ref builder36), typeof(Rectangle));
System.Text.ValueStringBuilder builder37 = new System.Text.ValueStringBuilder(0, 1);
builder37.AppendFormatted("System.Drawing.Point");
obj.Add(Types.ToTypeName(ref builder37), typeof(Point));
System.Text.ValueStringBuilder builder38 = new System.Text.ValueStringBuilder(0, 1);
builder38.AppendFormatted("System.Drawing.Size");
obj.Add(Types.ToTypeName(ref builder38), typeof(Size));
System.Text.ValueStringBuilder builder39 = new System.Text.ValueStringBuilder(0, 1);
builder39.AppendFormatted("System.Drawing.Color");
obj.Add(Types.ToTypeName(ref builder39), typeof(Color));
System.Text.ValueStringBuilder builder40 = new System.Text.ValueStringBuilder(0, 1);
builder40.AppendFormatted("System.Collections.Hashtable");
obj.Add(Types.ToTypeName(ref builder40), typeof(Hashtable));
System.Text.ValueStringBuilder builder41 = new System.Text.ValueStringBuilder(0, 1);
builder41.AppendFormatted("System.Collections.ArrayList");
obj.Add(Types.ToTypeName(ref builder41), typeof(ArrayList));
s_knownTypes = obj;
}
return s_knownTypes.TryGetValue(typeName, out type);
}
bool INrbfSerializer.TryBindToType(TypeName typeName, [Nullable(2)] [NotNullWhen(true)] out Type type)
{
return this.TryBindToType(typeName, out type);
}
public static bool IsFullySupportedType(Type type)
{
if (!(type == typeof(byte)) && !(type == typeof(sbyte)) && !(type == typeof(short)) && !(type == typeof(ushort)) && !(type == typeof(int)) && !(type == typeof(uint)) && !(type == typeof(long)) && !(type == typeof(ulong)) && !(type == typeof(double)) && !(type == typeof(float)) && !(type == typeof(char)) && !(type == typeof(bool)) && !(type == typeof(string)) && !(type == typeof(decimal)) && !(type == typeof(DateTime)) && !(type == typeof(TimeSpan)) && !(type == typeof(IntPtr)) && !(type == typeof(UIntPtr)) && !(type == typeof(List<byte>)) && !(type == typeof(List<sbyte>)) && !(type == typeof(List<short>)) && !(type == typeof(List<ushort>)) && !(type == typeof(List<int>)) && !(type == typeof(List<uint>)) && !(type == typeof(List<long>)) && !(type == typeof(List<ulong>)) && !(type == typeof(List<float>)) && !(type == typeof(List<double>)) && !(type == typeof(List<char>)) && !(type == typeof(List<bool>)) && !(type == typeof(List<string>)) && !(type == typeof(List<decimal>)) && !(type == typeof(List<DateTime>)) && !(type == typeof(List<TimeSpan>)) && !(type == typeof(byte[])) && !(type == typeof(sbyte[])) && !(type == typeof(short[])) && !(type == typeof(ushort[])) && !(type == typeof(int[])) && !(type == typeof(uint[])) && !(type == typeof(long[])) && !(type == typeof(ulong[])) && !(type == typeof(float[])) && !(type == typeof(double[])) && !(type == typeof(char[])) && !(type == typeof(bool[])) && !(type == typeof(string[])) && !(type == typeof(decimal[])) && !(type == typeof(DateTime[])) && !(type == typeof(TimeSpan[])) && !(type == typeof(RectangleF)) && !(type == typeof(PointF)) && !(type == typeof(SizeF)) && !(type == typeof(Rectangle)) && !(type == typeof(Point)) && !(type == typeof(Size)))
return type == typeof(Color);
return true;
}
bool INrbfSerializer.IsFullySupportedType(Type type)
{
return this.IsFullySupportedType(type);
}
}
}