コード例 #1
0
        private static int CalculateSize(Type value)
        {
            if (value == null)
            {
                return(SerializedSizeCalculatorHelper <Guid, SerializedSizeCalculator> .CalculateSerializedSize(Guid.Empty));
            }
            if (value.IsArray)
            {
                int num = SerializedSizeCalculatorHelper <Guid, SerializedSizeCalculator> .CalculateSerializedSize(SerializedSizeCalculator.arrayGuid);

                num += SerializedSizeCalculator.CalculateSize(value.GetElementType());
                return(num + SerializedSizeCalculator.CalculateSizeCount(value.Name.EndsWith("[]") ? 0 : value.GetArrayRank()));
            }
            if (value.IsGenericType)
            {
                int num2 = SerializedSizeCalculatorHelper <Guid, SerializedSizeCalculator> .CalculateSerializedSize(value.GetGenericTypeDefinition().GUID);

                foreach (Type value2 in value.GetGenericArguments())
                {
                    num2 += SerializedSizeCalculator.CalculateSize(value2);
                }
                return(num2);
            }
            return(SerializedSizeCalculatorHelper <Guid, SerializedSizeCalculator> .CalculateSerializedSize(value.GUID));
        }
コード例 #2
0
        private static int CalculateSize <T>(T?value) where T : struct
        {
            int num = 1;

            if (value != null)
            {
                num += SerializedSizeCalculatorHelper <T, SerializedSizeCalculator> .CalculateSerializedSize(value.Value);
            }
            return(num);
        }
コード例 #3
0
        private static int CalculateSize <T>(ICollection <T> values)
        {
            if (values == null)
            {
                return(1);
            }
            int num = SerializedSizeCalculator.CalculateSizeCount(values.Count + 1);

            foreach (T value in values)
            {
                num += SerializedSizeCalculatorHelper <T, SerializedSizeCalculator> .CalculateSerializedSize(value);
            }
            return(num);
        }
コード例 #4
0
        private static int CalculateSize <T>(ArraySegment <T> value)
        {
            int num  = SerializedSizeCalculator.CalculateSizeCount(value.Count + 1);
            int i    = value.Offset;
            int num2 = value.Offset + value.Count;

            while (i < num2)
            {
                num += SerializedSizeCalculatorHelper <T, SerializedSizeCalculator> .CalculateSerializedSize(value.Array[i]);

                i++;
            }
            return(num);
        }
コード例 #5
0
        private int CalculateSize(ICollection values)
        {
            if (values == null)
            {
                return(1);
            }
            int num = SerializedSizeCalculator.CalculateSizeCount(values.Count + 1);

            foreach (object value in values)
            {
                num += SerializedSizeCalculatorHelper <object, SerializedSizeCalculator> .CalculateSerializedSize(value);
            }
            return(num);
        }
コード例 #6
0
        private static int CalculateSize <T>(IList <T> value)
        {
            if (value == null)
            {
                return(1);
            }
            int num   = SerializedSizeCalculator.CalculateSizeCount(value.Count + 1);
            int i     = 0;
            int count = value.Count;

            while (i < count)
            {
                num += SerializedSizeCalculatorHelper <T, SerializedSizeCalculator> .CalculateSerializedSize(value[i]);

                i++;
            }
            return(num);
        }
コード例 #7
0
        private static void EmitCalculateFields(ILGenerator il, Type type)
        {
            int num = 0;

            foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
            {
                if (!fieldInfo.IsInitOnly && !fieldInfo.IsLiteral && !fieldInfo.IsNotSerialized)
                {
                    Type fieldType  = fieldInfo.FieldType;
                    int  staticSize = SerializedSizeCalculatorHelper <T, C> .GetStaticSize(fieldType);

                    if (0 < staticSize)
                    {
                        num += staticSize;
                    }
                    else
                    {
                        MethodInfo methodInfo = SerializedSizeCalculatorHelper <T, C> .FindDefinedCalculateMethod(fieldType);

                        if (methodInfo == null)
                        {
                            methodInfo = typeof(SerializedSizeCalculatorHelper <, >).MakeGenericType(new Type[]
                            {
                                fieldType,
                                typeof(C)
                            }).GetMethod("CalculateSerializedSize");
                        }
                        il.Emit(OpCodes.Ldarg_0);
                        il.Emit(OpCodes.Ldfld, fieldInfo);
                        il.EmitCall(OpCodes.Call, methodInfo, null);
                        il.Emit(OpCodes.Add);
                    }
                }
            }
            if (0 < num)
            {
                il.Emit(OpCodes.Ldc_I4, num);
                il.Emit(OpCodes.Add);
            }
        }
コード例 #8
0
        private static int CalculateSerializedSizeVirtual(T value)
        {
            Type type = (value == null) ? typeof(T) : value.GetType();
            int  num  = SerializedSizeCalculatorHelper <Type, C> .CalculateSerializedSize(type);

            if (SerializedSizeCalculatorHelper <T, C> .calculators == null)
            {
                SerializedSizeCalculatorHelper <T, C> .calculators = new Dictionary <Type, SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate>();
            }
            SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate calculateSerializedSizeDelegate;
            if (!SerializedSizeCalculatorHelper <T, C> .calculators.TryGetValue(type, out calculateSerializedSizeDelegate))
            {
                MethodInfo method = typeof(SerializedSizeCalculatorHelper <, >).MakeGenericType(new Type[]
                {
                    type,
                    typeof(C)
                }).GetMethod("CalculateSerializedSizeCore", BindingFlags.Static | BindingFlags.NonPublic);
                DynamicMethod dynamicMethod = new DynamicMethod(string.Format("{0}.{1}.CalculateSerializedSizeAs[{2}.{3}]", new object[]
                {
                    typeof(SerializedSizeCalculatorHelper <T, C>).Namespace,
                    typeof(SerializedSizeCalculatorHelper <T, C>).Name,
                    typeof(T).Namespace,
                    typeof(T).Name
                }), typeof(int), new Type[]
                {
                    typeof(T)
                }, typeof(SerializedSizeCalculatorHelper <T, C>), true);
                dynamicMethod.DefineParameter(1, ParameterAttributes.In, "value");
                ILGenerator ilgenerator = dynamicMethod.GetILGenerator();
                ilgenerator.Emit(OpCodes.Ldarg_0);
                ilgenerator.Emit(OpCodes.Unbox_Any, method.GetParameters()[0].ParameterType);
                ilgenerator.EmitCall(OpCodes.Call, method, null);
                ilgenerator.Emit(OpCodes.Ret);
                calculateSerializedSizeDelegate = (dynamicMethod.CreateDelegate(typeof(SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate)) as SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate);
                SerializedSizeCalculatorHelper <T, C> .calculators.Add(type, calculateSerializedSizeDelegate);
            }
            return(num + calculateSerializedSizeDelegate(value));
        }
コード例 #9
0
 public static int Calculate <T>(T value)
 {
     return(SerializedSizeCalculatorHelper <T, SerializedSizeCalculator> .CalculateSerializedSize(value));
 }
コード例 #10
0
 public static int CalculateSerializedSize(T value)
 {
     return(SerializedSizeCalculatorHelper <T, C> .calculateSerializedSize(value));
 }
コード例 #11
0
        private static void GenerateCalculator()
        {
            DynamicMethod dynamicMethod = new DynamicMethod(string.Format("{0}.{1}.CalculateSerializedSizeCore[{2}.{3}]", new object[]
            {
                typeof(SerializedSizeCalculatorHelper <T, C>).Namespace,
                typeof(SerializedSizeCalculatorHelper <T, C>).Name,
                typeof(T).Namespace,
                typeof(T).Name
            }), typeof(int), new Type[]
            {
                typeof(T)
            }, typeof(SerializedSizeCalculatorHelper <T, C>), true);

            dynamicMethod.DefineParameter(1, ParameterAttributes.In, "value");
            ILGenerator ilgenerator = dynamicMethod.GetILGenerator();
            Type        type        = typeof(T);
            Label?      label       = null;

            if (!type.IsValueType && SerializedSizeCalculatorHelper <T, C> .FindDefinedCalculateMethod(type) == null)
            {
                ilgenerator.Emit(OpCodes.Ldc_I4_1);
                ilgenerator.Emit(OpCodes.Ldarg_0);
                label = new Label?(ilgenerator.DefineLabel());
                ilgenerator.Emit(OpCodes.Brfalse, label.Value);
            }
            while (type != null)
            {
                MethodInfo methodInfo = SerializedSizeCalculatorHelper <T, C> .FindDefinedCalculateMethod(type);

                if (methodInfo != null)
                {
                    ilgenerator.Emit(OpCodes.Ldarg_0);
                    ilgenerator.EmitCall(OpCodes.Call, methodInfo, null);
                    if (type != typeof(T))
                    {
                        ilgenerator.Emit(OpCodes.Add);
                        break;
                    }
                    break;
                }
                else
                {
                    if (type == typeof(T))
                    {
                        int staticSize = SerializedSizeCalculatorHelper <T, C> .GetStaticSize(type);

                        if (staticSize >= 1)
                        {
                            ilgenerator.Emit(OpCodes.Ldc_I4, staticSize);
                            break;
                        }
                        ilgenerator.Emit(OpCodes.Ldc_I4_0);
                    }
                    SerializedSizeCalculatorHelper <T, C> .EmitCalculateFields(ilgenerator, type);

                    type = type.BaseType;
                }
            }
            if (label != null)
            {
                ilgenerator.Emit(OpCodes.Add);
                ilgenerator.MarkLabel(label.Value);
            }
            ilgenerator.Emit(OpCodes.Ret);
            SerializedSizeCalculatorHelper <T, C> .calculateSerializedSizeCore = (dynamicMethod.CreateDelegate(typeof(SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate)) as SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate);
            if (typeof(T).IsSealed || SerializedSizeCalculatorHelper <T, C> .FindDefinedCalculateMethod(typeof(T)) != null)
            {
                SerializedSizeCalculatorHelper <T, C> .calculateSerializedSize = SerializedSizeCalculatorHelper <T, C> .calculateSerializedSizeCore;
                return;
            }
            SerializedSizeCalculatorHelper <T, C> .calculateSerializedSize = new SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeDelegate(SerializedSizeCalculatorHelper <T, C> .CalculateSerializedSizeVirtual);
        }
コード例 #12
0
 static SerializedSizeCalculatorHelper()
 {
     SerializedSizeCalculatorHelper <T, C> .GenerateCalculator();
 }