Quasar/Server/Core/NetSerializer/Helpers.cs

90 lines
3.0 KiB
C#

/*
* Copyright 2015 Tomi Valkeinen
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
namespace xServer.Core.NetSerializer
{
static class Helpers
{
public static readonly ConstructorInfo ExceptionCtorInfo = typeof(Exception).GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null);
public static IEnumerable<FieldInfo> GetFieldInfos(Type type)
{
Debug.Assert(type.IsSerializable);
var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Where(fi => (fi.Attributes & FieldAttributes.NotSerialized) == 0)
.OrderBy(f => f.Name, StringComparer.Ordinal);
if (type.BaseType == null)
{
return fields;
}
else
{
var baseFields = GetFieldInfos(type.BaseType);
return baseFields.Concat(fields);
}
}
public static DynamicMethod GenerateDynamicSerializerStub(Type type)
{
var dm = new DynamicMethod("Serialize", null,
new Type[] { typeof(Serializer), typeof(Stream), type },
typeof(Serializer), true);
dm.DefineParameter(1, ParameterAttributes.None, "serializer");
dm.DefineParameter(2, ParameterAttributes.None, "stream");
dm.DefineParameter(3, ParameterAttributes.None, "value");
return dm;
}
public static DynamicMethod GenerateDynamicDeserializerStub(Type type)
{
var dm = new DynamicMethod("Deserialize", null,
new Type[] { typeof(Serializer), typeof(Stream), type.MakeByRefType() },
typeof(Serializer), true);
dm.DefineParameter(1, ParameterAttributes.None, "serializer");
dm.DefineParameter(2, ParameterAttributes.None, "stream");
dm.DefineParameter(3, ParameterAttributes.Out, "value");
return dm;
}
#if GENERATE_DEBUGGING_ASSEMBLY
public static MethodBuilder GenerateStaticSerializerStub(TypeBuilder tb, Type type)
{
var mb = tb.DefineMethod("Serialize", MethodAttributes.Public | MethodAttributes.Static, null,
new Type[] { typeof(Serializer), typeof(Stream), type });
mb.DefineParameter(1, ParameterAttributes.None, "serializer");
mb.DefineParameter(2, ParameterAttributes.None, "stream");
mb.DefineParameter(3, ParameterAttributes.None, "value");
return mb;
}
public static MethodBuilder GenerateStaticDeserializerStub(TypeBuilder tb, Type type)
{
var mb = tb.DefineMethod("Deserialize", MethodAttributes.Public | MethodAttributes.Static, null,
new Type[] { typeof(Serializer), typeof(Stream), type.MakeByRefType() });
mb.DefineParameter(1, ParameterAttributes.None, "serializer");
mb.DefineParameter(2, ParameterAttributes.None, "stream");
mb.DefineParameter(3, ParameterAttributes.Out, "value");
return mb;
}
#endif
}
}