Esempio n. 1
0
            ArrayMakeSerializer_Object(Type Type)
            {
                var Setter          = DynamicAssembly.TypeController.SetArray(Type);
                var Getter          = DynamicAssembly.TypeController.GetArray(Type);
                var ElementType     = Type.GetElementType();
                var ItemsSerializer = GetSerialize(Type.GetElementType());

                Action <SerializeData, (System.Array ar, int[] Ends)> Serializer = (Data, obj) =>
                {
                    var ar       = obj.ar;
                    var Ends     = obj.Ends;
                    var Rank     = Ends.Length;
                    var Currents = new int[Rank];
                    while (Currents[Currents.Length - 1] < Ends[Ends.Length - 1])
                    {
                        for (Currents[0] = 0; Currents[0] < Ends[0]; Currents[0]++)
                        {
                            Serializere.VisitedSerialize(Data, Getter(ar, Currents), ItemsSerializer);
                        }
                        for (int i = 1; i < Rank; i++)
                        {
                            if (Currents[i] < Ends[i])
                            {
                                Currents[i]++;
                                Currents[i - 1] = 0;
                            }
                        }
                    }
                };
                Action <DeserializeData, (System.Array ar, int[] Ends)> Deserializer = (Data, obj) =>
                {
                    var ar       = obj.ar;
                    var Ends     = obj.Ends;
                    var Rank     = Ends.Length;
                    var Currents = new int[Rank];

                    while (Currents[Currents.Length - 1] < Ends[Ends.Length - 1])
                    {
                        for (Currents[0] = 0; Currents[0] < Ends[0]; Currents[0]++)
                        {
                            var StandAloneCurrent = new int[Rank];
                            for (int i = 0; i < Rank; i++)
                            {
                                StandAloneCurrent[i] = Currents[i];
                            }
                            Serializere.VisitedDeserialize(Data, (c) => Setter(ar, c, StandAloneCurrent), ItemsSerializer);
                        }
                        for (int i = 1; i < Rank; i++)
                        {
                            if (Currents[i] < Ends[i])
                            {
                                Currents[i]++;
                                Currents[i - 1] = 0;
                            }
                        }
                    }
                };

                return(Serializer, Deserializer);
            }
Esempio n. 2
0
            public override void ArrayDeserializer(DeserializeData Data, Array ar)
            {
                var T_Ar = System.Runtime.CompilerServices.Unsafe.As <Array, t[]>(ref ar);
                var S_Ar = System.Runtime.InteropServices.MemoryMarshal.CreateSpan(ref T_Ar[0], ar.Length);

                for (int i = 0; i < S_Ar.Length; i++)
                {
                    var StandAlonePos = i;
                    Serializere.VisitedDeserialize(Data, (c) => T_Ar[StandAlonePos] = (t)c, this);
                }
            }
Esempio n. 3
0
            MakeSerializer_Serializable()
            {
                var Type          = typeof(t);
                var InterfaceType = Type.GetInterfaces().
                                    Where((c) => c.IsGenericType).
                                    Where((c) => c.GetGenericTypeDefinition() == ISerializableType).
                                    FirstOrDefault();

                var InnerType       = InterfaceType.GenericTypeArguments[0];
                var innerSerializer = GetSerialize(InnerType);
                var Getter          = InterfaceType.GetMethod("GetData");
                var Setter          = InterfaceType.GetMethod("SetData");
                Action <SerializeData, object> Serializer = (Data, obj) =>
                {
                    if (obj == null)
                    {
                        Data.Data.WriteByte(0);
                        return;
                    }

                    Data.Data.WriteByte(1);
                    Serializere.VisitedSerialize(Data, Getter.Invoke(obj, null), innerSerializer);
                };

                Func <DeserializeData, object> Deserializer = (Data) =>
                {
                    var ThisFrom = Data.From;
                    if (Data.Data[Data.From] == 0)
                    {
                        Data.From += 1;
                        return(null);
                    }
                    Data.From += 1;

                    object Result = GetUninitializedObject(Type);
                    Serializere.VisitedDeserialize(Data, (c) => Setter.Invoke(Result, new object[] { c }), innerSerializer);
                    return(Result);
                };

                return(Serializer, Deserializer);
            }