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); }
public override void ArraySerializer(SerializeData 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++) { Serializere.VisitedSerialize(Data, S_Ar[i], this); } }
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); }