/// <summary> /// 自增标识/关键字成员位图 /// </summary> /// <param name="memberMap"></param> internal static void SetIdentityOrPrimaryKeyMemberMap(MemberMap <valueType> memberMap) { if (Identity != null) { memberMap.SetMember(Identity.MemberMapIndex); } else if (PrimaryKeys.Length != 0) { foreach (Field field in PrimaryKeys) { memberMap.SetMember(field.MemberMapIndex); } } }
static Model() { Type type = typeof(valueType); attribute = TypeAttribute.GetAttribute <ModelAttribute>(type, true) ?? ModelAttribute.Default; Fields = Field.Get(MemberIndexGroup <valueType> .GetFields(attribute.MemberFilters), false).ToArray(); Identity = Field.GetIdentity(Fields); PrimaryKeys = Field.GetPrimaryKeys(Fields).ToArray(); MemberMap = new MemberMap <valueType>(); foreach (Field field in Fields) { MemberMap.SetMember(field.MemberMapIndex); } if (Identity != null) { IdentitySqlName = Identity.SqlFieldName; #if NOJIT new identity(Identity.Field).Get(out GetIdentity, out SetIdentity); Action <valueType, int> setter32; new identity32(Identity.Field).Get(out GetIdentity32, out setter32); #else DynamicMethod dynamicMethod = new DynamicMethod("GetSqlIdentity", typeof(long), new Type[] { type }, type, true); ILGenerator generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, Identity.FieldInfo); if (Identity.FieldInfo.FieldType != typeof(long) && Identity.FieldInfo.FieldType != typeof(ulong)) { generator.Emit(OpCodes.Conv_I8); } generator.Emit(OpCodes.Ret); GetIdentity = (Func <valueType, long>)dynamicMethod.CreateDelegate(typeof(Func <valueType, long>)); dynamicMethod = new DynamicMethod("SetSqlIdentity", null, new Type[] { type, typeof(long) }, type, true); generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_1); if (Identity.FieldInfo.FieldType != typeof(long) && Identity.FieldInfo.FieldType != typeof(ulong)) { generator.Emit(OpCodes.Conv_I4); } generator.Emit(OpCodes.Stfld, Identity.FieldInfo); generator.Emit(OpCodes.Ret); SetIdentity = (Action <valueType, long>)dynamicMethod.CreateDelegate(typeof(Action <valueType, long>)); GetIdentity32 = getIdentityGetter32("GetSqlIdentity32", Identity.FieldInfo); #endif } }
/// <summary> /// 设置真实成员位图 /// </summary> /// <typeparam name="valueType"></typeparam> /// <typeparam name="modelType"></typeparam> /// <param name="sqlTool"></param> /// <param name="memberMap"></param> internal override void SetRealMemberMap <valueType, modelType>(Sql.Table <valueType, modelType> sqlTool, MemberMap <modelType> memberMap) { if (sqlTool.Attribute.IsSetRealMemberMap) { MemberMap <modelType> realMemberMap = MemberMap <modelType> .NewEmpty(); using (DbConnection connection = GetConnection()) using (DbCommand command = getCommand(connection, "select top 1 * from [" + sqlTool.TableName + "]", CommandType.Text)) using (DataSet dataSet = getDataSet(command)) { foreach (DataColumn dataColumn in dataSet.Tables[0].Columns) { realMemberMap.SetMember(dataColumn.ColumnName); } } memberMap.And(realMemberMap); } }
public int Call(XmlDeSerializer deSerializer, MemberMap memberMap, ref T value) { //deSerializer.ItemName = ItemName; //if ((deSerializer.Config.MemberFilter & MemberFilter) == MemberFilter) //{ // TryDeSerialize(deSerializer, ref value); // if (deSerializer.State == DeSerializeState.Success) // { // memberMap.SetMember(MemberMapIndex); // return 1; // } // return 0; //} //return deSerializer.IgnoreValue(); deSerializer.ItemName = ItemName; TryDeSerialize(deSerializer, ref value); if (deSerializer.State == DeSerializeState.Success) { memberMap.SetMember(MemberMapIndex); return(1); } return(0); }
static TypeSerializer() { Type type = typeof(valueType), attributeType; MethodInfo methodInfo = Serializer.GetSerializeMethod(type); attribute = type.customAttribute <SerializeAttribute>(out attributeType) ?? Serializer.DefaultAttribute; if (methodInfo != null) { DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), methodInfo); isValueType = true; IsReferenceMember = false; return; } if (type.IsArray) { isValueType = true; if (type.GetArrayRank() == 1) { Type elementType = type.GetElementType(); if (!elementType.IsPointer && !typeof(Delegate).IsAssignableFrom(elementType)) { if (elementType.IsValueType) { if (elementType.IsEnum) { Type enumType = System.Enum.GetUnderlyingType(elementType); if (enumType == typeof(uint)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumUIntArrayMethod; // SerializeMethodCache.EnumUIntArrayMethod; } else if (enumType == typeof(byte)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumByteArrayMethod; //SerializeMethodCache.EnumByteArrayMethod; } else if (enumType == typeof(ulong)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumULongArrayMethod; //SerializeMethodCache.EnumULongArrayMethod; } else if (enumType == typeof(ushort)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumUShortArrayMethod; //SerializeMethodCache.EnumUShortArrayMethod; } else if (enumType == typeof(long)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumLongArrayMethod; //SerializeMethodCache.EnumLongArrayMethod; } else if (enumType == typeof(short)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumShortArrayMethod; //SerializeMethodCache.EnumShortArrayMethod; } else if (enumType == typeof(sbyte)) { methodInfo = GenericType.Get(elementType).BinarySerializeEnumSByteArrayMethod; //SerializeMethodCache.EnumSByteArrayMethod; } else { methodInfo = GenericType.Get(elementType).BinarySerializeEnumIntArrayMethod; //SerializeMethodCache.EnumIntArrayMethod; } //methodInfo = methodInfo.MakeGenericMethod(elementType); IsReferenceMember = false; } else if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(Nullable <>)) { //methodInfo = SerializeMethodCache.NullableArrayMethod.MakeGenericMethod(elementType = elementType.GetGenericArguments()[0]); methodInfo = StructGenericType.Get(elementType = elementType.GetGenericArguments()[0]).BinarySerializeNullableArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } else { //methodInfo = SerializeMethodCache.StructArrayMethod.MakeGenericMethod(elementType); methodInfo = GenericType.Get(elementType).BinarySerializeStructArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } } else { //methodInfo = SerializeMethodCache.ArrayMethod.MakeGenericMethod(elementType); methodInfo = ClassGenericType.Get(elementType).BinarySerializeArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), methodInfo); return; } } DefaultSerializer = toNull; IsReferenceMember = false; return; } if (type.IsEnum) { Type enumType = System.Enum.GetUnderlyingType(type); if (enumType == typeof(uint)) { DefaultSerializer = enumUInt; } else if (enumType == typeof(byte)) { DefaultSerializer = enumByte; } else if (enumType == typeof(ulong)) { DefaultSerializer = enumULong; } else if (enumType == typeof(ushort)) { DefaultSerializer = enumUShort; } else if (enumType == typeof(long)) { DefaultSerializer = enumLong; } else if (enumType == typeof(short)) { DefaultSerializer = enumShort; } else if (enumType == typeof(sbyte)) { DefaultSerializer = enumSByte; } else { DefaultSerializer = enumInt; } isValueType = true; IsReferenceMember = false; return; } if (type.IsPointer || typeof(Delegate).IsAssignableFrom(type)) { DefaultSerializer = toNull; IsReferenceMember = false; isValueType = true; return; } if (type.IsGenericType) { Type genericType = type.GetGenericTypeDefinition(); Type[] parameterTypes = type.GetGenericArguments(); if (genericType == typeof(LeftArray <>)) { //DefaultSerializer = (Action<Serializer, valueType>)Delegate.CreateDelegate(typeof(Action<Serializer, valueType>), SerializeMethodCache.LeftArraySerializeMethod.MakeGenericMethod(parameterTypes)); DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), GenericType.Get(parameterTypes[0]).BinarySerializeLeftArrayMethod); IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } #if !Serialize if (genericType == typeof(SubArray <>)) { //DefaultSerializer = (Action<Serializer, valueType>)Delegate.CreateDelegate(typeof(Action<Serializer, valueType>), SerializeMethodCache.SubArraySerializeMethod.MakeGenericMethod(parameterTypes)); DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), GenericType.Get(parameterTypes[0]).BinarySerializeSubArrayMethod); IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } #endif if (genericType == typeof(Dictionary <,>) || genericType == typeof(SortedDictionary <,>) || genericType == typeof(SortedList <,>)) { //DefaultSerializer = (Action<Serializer, valueType>)Delegate.CreateDelegate(typeof(Action<Serializer, valueType>), SerializeMethodCache.DictionarySerializeMethod.MakeGenericMethod(type, parameterTypes[0], parameterTypes[1])); DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), DictionaryGenericType3.Get(type, parameterTypes[0], parameterTypes[1]).BinarySerializeDictionaryMethod); IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]) || SerializeMethodCache.IsReferenceMember(parameterTypes[1]); isValueType = true; return; } if (genericType == typeof(Nullable <>)) { //DefaultSerializer = (Action<Serializer, valueType>)Delegate.CreateDelegate(typeof(Action<Serializer, valueType>), SerializeMethodCache.NullableSerializeMethod.MakeGenericMethod(parameterTypes)); DefaultSerializer = (Action <Serializer, valueType>)StructGenericType.Get(parameterTypes[0]).BinarySerializeNullableDelegate; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } if (genericType == typeof(KeyValuePair <,>)) { //DefaultSerializer = (Action<Serializer, valueType>)Delegate.CreateDelegate(typeof(Action<Serializer, valueType>), SerializeMethodCache.KeyValuePairSerializeMethod.MakeGenericMethod(parameterTypes)); DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), GenericType2.Get(parameterTypes).BinarySerializeKeyValuePairMethod); IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]) || SerializeMethodCache.IsReferenceMember(parameterTypes[1]); isValueType = true; return; } } if ((methodInfo = SerializeMethodCache.GetCustom(type, true)) != null) { if (type.IsValueType) { #if NOJIT DefaultSerializer = new CustomSerializer(methodInfo).Serialize; #else DynamicMethod dynamicMethod = new DynamicMethod("CustomSerializer", null, new Type[] { typeof(Serializer), type }, type, true); ILGenerator generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarga_S, 1); generator.Emit(OpCodes.Ldarg_0); generator.call(methodInfo); generator.Emit(OpCodes.Ret); DefaultSerializer = (Action <Serializer, valueType>)dynamicMethod.CreateDelegate(typeof(Action <Serializer, valueType>)); #endif } else { DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), methodInfo); } IsReferenceMember = attribute.IsReferenceMember; isValueType = true; return; } if (type.IsInterface || type.IsAbstract || Emit.Constructor <valueType> .New == null) { DefaultSerializer = noConstructor; isValueType = IsReferenceMember = true; return; } ConstructorInfo constructorInfo = null; Type argumentType = null; IsReferenceMember = attribute.IsReferenceMember; foreach (Type interfaceType in type.GetInterfaces()) { if (interfaceType.IsGenericType) { Type genericType = interfaceType.GetGenericTypeDefinition(); if (genericType == typeof(ICollection <>)) { Type[] parameterTypes = interfaceType.GetGenericArguments(); argumentType = parameterTypes[0]; parameterTypes[0] = argumentType.MakeArrayType(); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameterTypes, null); if (constructorInfo != null) { break; } parameterTypes[0] = typeof(IList <>).MakeGenericType(argumentType); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameterTypes, null); if (constructorInfo != null) { break; } parameterTypes[0] = typeof(ICollection <>).MakeGenericType(argumentType); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameterTypes, null); if (constructorInfo != null) { break; } parameterTypes[0] = typeof(IEnumerable <>).MakeGenericType(argumentType); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameterTypes, null); if (constructorInfo != null) { break; } } else if (genericType == typeof(IDictionary <,>)) { constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { interfaceType }, null); if (constructorInfo != null) { Type[] parameters = interfaceType.GetGenericArguments(); //methodInfo = (type.IsValueType ? SerializeMethodCache.StructDictionaryMethod : SerializeMethodCache.ClassDictionaryMethod).MakeGenericMethod(type, parameters[0], parameters[1]); if (type.IsValueType) { methodInfo = DictionaryGenericType3.Get(type, parameters[0], parameters[1]).BinarySerializeStructDictionaryMethod; } else { methodInfo = DictionaryGenericType3.Get(type, parameters[0], parameters[1]).BinarySerializeClassDictionaryMethod; } DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), methodInfo); return; } } } } if (constructorInfo != null) { if (argumentType.IsValueType && argumentType.IsEnum) { Type enumType = System.Enum.GetUnderlyingType(argumentType); //if (enumType == typeof(uint)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumUIntCollectionMethod : SerializeMethodCache.ClassEnumUIntCollectionMethod; //else if (enumType == typeof(byte)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumByteCollectionMethod : SerializeMethodCache.ClassEnumByteCollectionMethod; //else if (enumType == typeof(ulong)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumULongCollectionMethod : SerializeMethodCache.ClassEnumULongCollectionMethod; //else if (enumType == typeof(ushort)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumUShortCollectionMethod : SerializeMethodCache.ClassEnumUShortCollectionMethod; //else if (enumType == typeof(long)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumLongCollectionMethod : SerializeMethodCache.ClassEnumLongCollectionMethod; //else if (enumType == typeof(short)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumShortCollectionMethod : SerializeMethodCache.ClassEnumShortCollectionMethod; //else if (enumType == typeof(sbyte)) methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumSByteCollectionMethod : SerializeMethodCache.ClassEnumSByteCollectionMethod; //else methodInfo = type.IsValueType ? SerializeMethodCache.StructEnumIntCollectionMethod : SerializeMethodCache.ClassEnumIntCollectionMethod; //methodInfo = methodInfo.MakeGenericMethod(argumentType, type); if (enumType == typeof(uint)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumUIntCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumUIntCollectionMethod; } else if (enumType == typeof(byte)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumByteCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumByteCollectionMethod; } else if (enumType == typeof(ulong)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumULongCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumULongCollectionMethod; } else if (enumType == typeof(ushort)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumUShortCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumUShortCollectionMethod; } else if (enumType == typeof(long)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumLongCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumLongCollectionMethod; } else if (enumType == typeof(short)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumShortCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumShortCollectionMethod; } else if (enumType == typeof(sbyte)) { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumSByteCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumSByteCollectionMethod; } else { methodInfo = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumIntCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumIntCollectionMethod; } } //else methodInfo = (type.IsValueType ? SerializeMethodCache.StructCollectionMethod : SerializeMethodCache.ClassCollectionMethod).MakeGenericMethod(argumentType, type); else { if (type.IsValueType) { methodInfo = CollectionGenericType2.Get(type, argumentType).BinarySerializeStructCollectionMethod; } else { methodInfo = CollectionGenericType2.Get(type, argumentType).BinarySerializeClassCollectionMethod; } } DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), methodInfo); return; } if (type.IsValueType) { isValueType = true; } else if (attribute != Serializer.DefaultAttribute && attributeType != type) { for (Type baseType = type.BaseType; baseType != typeof(object); baseType = baseType.BaseType) { SerializeAttribute baseAttribute = baseType.customAttribute <SerializeAttribute>(); if (baseAttribute != null) { if (baseAttribute.IsBaseType) { methodInfo = SerializeMethodCache.BaseSerializeMethod.MakeGenericMethod(baseType, type); DefaultSerializer = (Action <Serializer, valueType>)Delegate.CreateDelegate(typeof(Action <Serializer, valueType>), methodInfo); return; } break; } } } isJson = attribute.GetIsJson; isMemberMap = attribute.GetIsMemberMap; Fields <FieldSize> fields = SerializeMethodCache.GetFields(attribute.IsAnonymousFields ? MemberIndexGroup <valueType> .GetAnonymousFields(attribute.MemberFilters) : MemberIndexGroup <valueType> .GetFields(attribute.MemberFilters), isJson, out memberCountVerify); //if (!type.IsValueType && (fields.FixedFields.length | fields.Fields.length | fields.JsonFields.length) == 0) //{ // DefaultSerializer = noMember; // isValueType = true; // IsReferenceMember = false; // return; //} fixedFillSize = -fields.FixedSize & 3; fixedSize = (fields.FixedSize + (sizeof(int) + 3)) & (int.MaxValue - 3); #if NOJIT fixedMemberSerializer = new FieldFerializer(ref fields.FixedFields).Serialize; if (isMemberMap) { fixedMemberMapSerializer = new MemberMapSerializer(ref fields.FixedFields).Serialize; } if (fields.FieldArray.Length != 0) { memberSerializer = new FieldFerializer(ref fields.FieldArray).Serialize; if (isMemberMap) { memberMapSerializer = new MemberMapSerializer(ref fields.FieldArray).Serialize; } } #else SerializeMemberDynamicMethod fixedDynamicMethod = new SerializeMemberDynamicMethod(type); SerializeMemberMapDynamicMethod fixedMemberMapDynamicMethod = isMemberMap ? new SerializeMemberMapDynamicMethod(type) : default(SerializeMemberMapDynamicMethod); foreach (FieldSize member in fields.FixedFields) { fixedDynamicMethod.Push(member); if (isMemberMap) { fixedMemberMapDynamicMethod.Push(member); } } fixedMemberSerializer = (Action <Serializer, valueType>)fixedDynamicMethod.Create <Action <Serializer, valueType> >(); if (isMemberMap) { fixedMemberMapSerializer = (Action <MemberMap, Serializer, valueType>)fixedMemberMapDynamicMethod.Create <Action <MemberMap, Serializer, valueType> >(); } if (fields.FieldArray.Length != 0) { SerializeMemberDynamicMethod dynamicMethod = new SerializeMemberDynamicMethod(type); SerializeMemberMapDynamicMethod memberMapDynamicMethod = isMemberMap ? new SerializeMemberMapDynamicMethod(type) : default(SerializeMemberMapDynamicMethod); foreach (FieldSize member in fields.FieldArray) { dynamicMethod.Push(member); if (isMemberMap) { memberMapDynamicMethod.Push(member); } } memberSerializer = (Action <Serializer, valueType>)dynamicMethod.Create <Action <Serializer, valueType> >(); if (isMemberMap) { memberMapSerializer = (Action <MemberMap, Serializer, valueType>)memberMapDynamicMethod.Create <Action <MemberMap, Serializer, valueType> >(); } } #endif if (fields.JsonFields.Length != 0) { jsonMemberMap = new MemberMap <valueType>(); jsonMemberIndexs = new int[fields.JsonFields.Length]; int index = 0; foreach (FieldIndex field in fields.JsonFields) { jsonMemberMap.SetMember(jsonMemberIndexs[index++] = field.MemberIndex); } } }
/// <summary> /// 获取分组数据成员位图 /// </summary> /// <param name="group">分组</param> /// <returns>分组数据成员位图</returns> private static MemberMap <valueType> getGroupMemberMap(int group) { if (groupMemberMaps == null) { LeftArray <KeyValue <MemberMap <valueType>, int> > memberMaps = new LeftArray <KeyValue <MemberMap <valueType>, int> >(); memberMaps.Add(new KeyValue <MemberMap <valueType>, int>(MemberMap, 0)); Monitor.Enter(groupMemberMapLock); if (groupMemberMaps == null) { try { foreach (Field field in Fields) { if (field.DataMember.Group != 0) { int index = memberMaps.Length; foreach (KeyValue <MemberMap <valueType>, int> memberMap in memberMaps.Array) { if (memberMap.Value == field.DataMember.Group || --index == 0) { break; } } if (index == 0) { MemberMap <valueType> memberMap = new MemberMap <valueType>(); memberMaps.Add(new KeyValue <MemberMap <valueType>, int>(memberMap, field.DataMember.Group)); memberMap.SetMember(field.MemberMapIndex); } else { memberMaps.Array[memberMaps.Length - index].Key.SetMember(field.MemberMapIndex); } } } if (memberMaps.Length != 1) { MemberMap <valueType> memberMap = memberMaps.Array[0].Key = new MemberMap <valueType>(); foreach (Field field in Fields) { if (field.DataMember.Group == 0) { memberMap.SetMember(field.MemberMapIndex); } } } groupMemberMaps = memberMaps.ToArray(); } finally { Monitor.Exit(groupMemberMapLock); } } else { Monitor.Exit(groupMemberMapLock); } } foreach (KeyValue <MemberMap <valueType>, int> memberMap in groupMemberMaps) { if (memberMap.Value == group) { return(memberMap.Key); } } AutoCSer.Log.Pub.Log.add(AutoCSer.Log.LogType.Error, typeof(valueType).fullName() + " 缺少缓存分组 " + group.toString()); return(null); }
/// <summary> /// 二进制数据反序列化 /// </summary> /// <param name="globalVersion"></param> /// <param name="fields"></param> /// <param name="memberCountVerify"></param> internal TypeDeSerializer(uint globalVersion, ref Fields <FieldSize> fields, int memberCountVerify) { Type type = typeof(valueType); this.globalVersion = globalVersion; this.memberCountVerify = memberCountVerify; fixedFillSize = -fields.FixedSize & 3; #if NOJIT fixedMemberDeSerializer = new FieldDeSerializer(ref fields.FixedFields).DeSerialize; if (isMemberMap) { fixedMemberMapDeSerializer = new MemberMapDeSerializer(ref fields.FixedFields).DeSerialize; } if (fields.FieldArray.Length != 0) { memberDeSerializer = new FieldDeSerializer(ref fields.FieldArray).DeSerialize; if (isMemberMap) { memberMapDeSerializer = new MemberMapDeSerializer(ref fields.FieldArray).DeSerialize; } } #else DeSerializeMemberDynamicMethod fixedDynamicMethod = new DeSerializeMemberDynamicMethod(type); DeSerializeMemberMapDynamicMethod fixedMemberMapDynamicMethod = isMemberMap ? new DeSerializeMemberMapDynamicMethod(type) : default(DeSerializeMemberMapDynamicMethod); foreach (FieldSize member in fields.FixedFields) { fixedDynamicMethod.Push(member); if (isMemberMap) { fixedMemberMapDynamicMethod.Push(member); } } fixedMemberDeSerializer = (deSerialize)fixedDynamicMethod.Create <deSerialize>(); if (isMemberMap) { fixedMemberMapDeSerializer = (memberMapDeSerialize)fixedMemberMapDynamicMethod.Create <memberMapDeSerialize>(); } if (fields.FieldArray.Length != 0) { DeSerializeMemberDynamicMethod dynamicMethod = new DeSerializeMemberDynamicMethod(type); DeSerializeMemberMapDynamicMethod memberMapDynamicMethod = isMemberMap ? new DeSerializeMemberMapDynamicMethod(type) : default(DeSerializeMemberMapDynamicMethod); foreach (FieldSize member in fields.FieldArray) { dynamicMethod.Push(member); if (isMemberMap) { memberMapDynamicMethod.Push(member); } } memberDeSerializer = (deSerialize)dynamicMethod.Create <deSerialize>(); if (isMemberMap) { memberMapDeSerializer = (memberMapDeSerialize)memberMapDynamicMethod.Create <memberMapDeSerialize>(); } } #endif if (fields.JsonFields.Length != 0) { jsonMemberMap = new MemberMap <valueType>(); jsonMemberIndexs = new int[fields.JsonFields.Length]; int index = 0; foreach (FieldIndex field in fields.JsonFields) { jsonMemberMap.SetMember(jsonMemberIndexs[index++] = field.MemberIndex); } } }
public void Call(JsonDeSerializer jsonDeSerializer, MemberMap memberMap, ref T value) { TryDeSerialize(jsonDeSerializer, ref value); memberMap.SetMember(MemberMapIndex); }