/// <summary> /// 创建二进制数据反序列化 /// </summary> /// <param name="attribute"></param> /// <returns></returns> internal TypeDeSerializer <valueType> CreateOnly(BinarySerializeAttribute attribute) { DeSerializeVersionField[] fieldArray = this.fields; LeftArray <FieldSize> fixedFields = new LeftArray <FieldSize>(fieldArray.Length - noSerializeMemberCount), fields = new LeftArray <FieldSize>(fieldArray.Length - noSerializeMemberCount); LeftArray <AutoCSer.Metadata.FieldIndex> jsonFields = new LeftArray <AutoCSer.Metadata.FieldIndex>(0); int fixedSize = 0; AutoCSer.Algorithm.QuickSort.Sort(fieldArray, DeSerializeVersionField.MemberNameSort, 0, fieldArray.Length); if (attribute.GetIsMemberMap) { int memberIndex = 0; LeftArray <DeSerializeVersionField> newFields = new LeftArray <DeSerializeVersionField>(fieldArray.Length); foreach (DeSerializeVersionField field in fieldArray) { if (field.Attribute != null) { if (field.Field.MemberIndex == memberIndex) { newFields.Add(field); } else { newFields.Add(field.Copy(memberIndex)); } } ++memberIndex; } fieldArray = newFields.ToArray(); } else if (noSerializeMemberCount != 0) { fieldArray = fieldArray.getFindArray(value => value.Attribute != null); } foreach (DeSerializeVersionField field in fieldArray) { BinarySerializeMemberAttribute memberAttribute = field.Attribute; if (memberAttribute.GetIsJson) { jsonFields.Add(field.Field); } else { FieldSize value = new FieldSize(field.Field); if (value.FixedSize == 0) { fields.Add(value); } else { fixedFields.Add(value); fixedSize += value.FixedSize; } } } int memberCountVerify; Fields <FieldSize> fieldSizes = new Fields <FieldSize>(ref fixedFields, ref fields, ref jsonFields, fixedSize, attribute.GetIsJson, out memberCountVerify); return(DeSerializer = new TypeDeSerializer <valueType>(GlobalVersion, ref fieldSizes, memberCountVerify)); }
/// <summary> /// 创建二进制数据反序列化 /// </summary> /// <param name="attribute"></param> /// <returns></returns> internal TypeDeSerializer <valueType> Create(BinarySerializeAttribute attribute) { Monitor.Enter(CreateLock); try { if (DeSerializer == null) { CreateOnly(attribute); fields = null; } } finally { Monitor.Exit(CreateLock); } return(DeSerializer); }
static TypeSerializer() { Type type = typeof(T), attributeType; MethodInfo methodInfo = BinarySerializer.GetSerializeMethod(type); attribute = type.customAttribute <BinarySerializeAttribute>(out attributeType) ?? BinarySerializer.DefaultAttribute; if (methodInfo != null) { DefaultSerializer = (Action <BinarySerializer, T>)Delegate.CreateDelegate(typeof(Action <BinarySerializer, T>), 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)) { Delegate arrayDelegate; if (elementType.IsValueType) { if (elementType.IsEnum) { arrayDelegate = EnumGenericType.Get(elementType).BinarySerializeEnumArrayDelegate; IsReferenceMember = false; } else if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(Nullable <>)) { arrayDelegate = StructGenericType.Get(elementType = elementType.GetGenericArguments()[0]).BinarySerializeNullableArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } else { arrayDelegate = GenericType.Get(elementType).BinarySerializeStructArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } } else { arrayDelegate = ClassGenericType.Get(elementType).BinarySerializeArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } DefaultSerializer = (Action <BinarySerializer, T>)arrayDelegate; 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 <BinarySerializer, T>)GenericType.Get(parameterTypes[0]).BinarySerializeLeftArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } #if !Serialize if (genericType == typeof(SubArray <>)) { DefaultSerializer = (Action <BinarySerializer, T>)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 <BinarySerializer, T>)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 <BinarySerializer, T>)StructGenericType.Get(parameterTypes[0]).BinarySerializeNullableDelegate; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } if (genericType == typeof(KeyValuePair <,>)) { DefaultSerializer = (Action <BinarySerializer, T>)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(BinarySerializer), 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 <BinarySerializer, T>)dynamicMethod.CreateDelegate(typeof(Action <BinarySerializer, T>)); #endif } else { DefaultSerializer = (Action <BinarySerializer, T>)Delegate.CreateDelegate(typeof(Action <BinarySerializer, T>), methodInfo); } IsReferenceMember = attribute.IsReferenceMember; isValueType = true; return; } if (type.isSerializeNotSupport()) { 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(); if (type.IsValueType) { DefaultSerializer = (Action <BinarySerializer, T>)DictionaryGenericType3.Get(type, parameters[0], parameters[1]).BinarySerializeStructDictionaryMethod; } else { DefaultSerializer = (Action <BinarySerializer, T>)DictionaryGenericType3.Get(type, parameters[0], parameters[1]).BinarySerializeClassDictionaryMethod; } return; } } } } if (constructorInfo != null) { Delegate collectionDelegate; if (argumentType.IsValueType && argumentType.IsEnum) { Type enumType = System.Enum.GetUnderlyingType(argumentType); if (enumType == typeof(uint)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumUIntCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumUIntCollectionMethod; } else if (enumType == typeof(byte)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumByteCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumByteCollectionMethod; } else if (enumType == typeof(ulong)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumULongCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumULongCollectionMethod; } else if (enumType == typeof(ushort)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumUShortCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumUShortCollectionMethod; } else if (enumType == typeof(long)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumLongCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumLongCollectionMethod; } else if (enumType == typeof(short)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumShortCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumShortCollectionMethod; } else if (enumType == typeof(sbyte)) { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumSByteCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumSByteCollectionMethod; } else { collectionDelegate = type.IsValueType ? CollectionGenericType2.Get(type, argumentType).BinarySerializeStructEnumIntCollectionMethod : CollectionGenericType2.Get(type, argumentType).BinarySerializeClassEnumIntCollectionMethod; } } else { if (type.IsValueType) { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinarySerializeStructCollectionMethod; } else { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinarySerializeClassCollectionMethod; } } DefaultSerializer = (Action <BinarySerializer, T>)collectionDelegate; return; } if (type.IsValueType) { isValueType = true; } else if (attribute != BinarySerializer.DefaultAttribute && attributeType != type) { for (Type baseType = type.BaseType; baseType != typeof(object); baseType = baseType.BaseType) { BinarySerializeAttribute baseAttribute = baseType.customAttribute <BinarySerializeAttribute>(); if (baseAttribute != null) { if (baseAttribute.IsBaseType) { methodInfo = SerializeMethodCache.BaseSerializeMethod.MakeGenericMethod(baseType, type); DefaultSerializer = (Action <BinarySerializer, T>)Delegate.CreateDelegate(typeof(Action <BinarySerializer, T>), methodInfo); return; } break; } } } isJson = attribute.GetIsJson; isMemberMap = attribute.GetIsMemberMap; Fields <FieldSize> fields = SerializeMethodCache.GetFields(attribute.IsAnonymousFields ? MemberIndexGroup <T> .GetAnonymousFields(attribute.MemberFilters) : MemberIndexGroup <T> .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 <BinarySerializer, T>)fixedDynamicMethod.Create <Action <BinarySerializer, T> >(); if (isMemberMap) { fixedMemberMapSerializer = (Action <MemberMap, BinarySerializer, T>)fixedMemberMapDynamicMethod.Create <Action <MemberMap, BinarySerializer, T> >(); } 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 <BinarySerializer, T>)dynamicMethod.Create <Action <BinarySerializer, T> >(); if (isMemberMap) { memberMapSerializer = (Action <MemberMap, BinarySerializer, T>)memberMapDynamicMethod.Create <Action <MemberMap, BinarySerializer, T> >(); } } #endif if (fields.JsonFields.Length != 0) { jsonMemberMap = new MemberMap <T>(); jsonMemberIndexs = new int[fields.JsonFields.Length]; int index = 0; foreach (FieldIndex field in fields.JsonFields) { jsonMemberMap.SetMember(jsonMemberIndexs[index++] = field.MemberIndex); } } }
static TypeDeSerializer() { Type type = typeof(T), attributeType; MethodInfo methodInfo = BinaryDeSerializer.GetDeSerializeMethod(type); attribute = type.customAttribute <BinarySerializeAttribute>(out attributeType) ?? BinarySerializer.DefaultAttribute; if (methodInfo != null) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(BinaryDeSerializer.DeSerializeDelegate <T>), methodInfo); IsReferenceMember = false; isValueType = true; return; } if (type.IsArray) { isValueType = true; if (type.GetArrayRank() == 1) { Type elementType = type.GetElementType(); if (!elementType.IsPointer && !typeof(Delegate).IsAssignableFrom(elementType)) { Delegate arrayDelegate; if (elementType.IsValueType) { if (elementType.IsEnum) { arrayDelegate = EnumGenericType.Get(elementType).BinaryDeSerializeEnumArrayDelegate; IsReferenceMember = false; } else if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(Nullable <>)) { arrayDelegate = StructGenericType.Get(elementType = elementType.GetGenericArguments()[0]).BinaryDeSerializeNullableArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } else { arrayDelegate = GenericType.Get(elementType).BinaryDeSerializeStructArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } } else { arrayDelegate = ClassGenericType.Get(elementType).BinaryDeSerializeArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(elementType); } DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)arrayDelegate; return; } } DefaultDeSerializer = fromNull; IsReferenceMember = false; return; } if (type.IsEnum) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)EnumGenericType.Get(type).BinaryDeSerializeEnumDelegate; IsReferenceMember = false; isValueType = true; return; } if (type.IsPointer || typeof(Delegate).IsAssignableFrom(type)) { DefaultDeSerializer = fromNull; IsReferenceMember = false; isValueType = true; return; } if (type.IsGenericType) { Type genericType = type.GetGenericTypeDefinition(); Type[] parameterTypes = type.GetGenericArguments(); if (genericType == typeof(LeftArray <>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type.GetGenericArguments()[0]).BinaryDeSerializeLeftArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } #if !Serialize if (genericType == typeof(SubArray <>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type.GetGenericArguments()[0]).BinaryDeSerializeSubArrayMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } #endif if (genericType == typeof(Dictionary <,>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).BinaryDeSerializeDictionaryMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]) || SerializeMethodCache.IsReferenceMember(parameterTypes[1]); isValueType = true; return; } if (genericType == typeof(Nullable <>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)StructGenericType.Get(type.GetGenericArguments()[0]).BinaryDeSerializeNullableMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]); isValueType = true; return; } if (genericType == typeof(KeyValuePair <,>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).BinaryDeSerializeKeyValuePairMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]) || SerializeMethodCache.IsReferenceMember(parameterTypes[1]); isValueType = true; return; } if (genericType == typeof(SortedDictionary <,>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).BinaryDeSerializeSortedDictionaryMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]) || SerializeMethodCache.IsReferenceMember(parameterTypes[1]); isValueType = true; return; } if (genericType == typeof(SortedList <,>)) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).BinaryDeSerializeSortedListMethod; IsReferenceMember = SerializeMethodCache.IsReferenceMember(parameterTypes[0]) || SerializeMethodCache.IsReferenceMember(parameterTypes[1]); isValueType = true; return; } } if ((methodInfo = SerializeMethodCache.GetCustom(type, false)) != null) { if (type.IsValueType) { #if NOJIT DefaultDeSerializer = new CustomDeSerializer(methodInfo).DeSerialize; #else DynamicMethod dynamicMethod = new DynamicMethod("CustomDeSerializer", null, new Type[] { typeof(BinaryDeSerializer), type.MakeByRefType() }, type, true); ILGenerator generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_0); generator.call(methodInfo); generator.Emit(OpCodes.Ret); DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)dynamicMethod.CreateDelegate(typeof(BinaryDeSerializer.DeSerializeDelegate <T>)); #endif } else { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(BinaryDeSerializer.DeSerializeDelegate <T>), methodInfo); } IsReferenceMember = attribute.IsReferenceMember; isValueType = true; return; } if (type.isSerializeNotSupport()) { DefaultDeSerializer = noConstructor; isValueType = IsReferenceMember = true; return; } IsReferenceMember = attribute.IsReferenceMember; Delegate collectionDelegate = null; foreach (Type interfaceType in type.GetInterfaces()) { if (interfaceType.IsGenericType) { Type genericType = interfaceType.GetGenericTypeDefinition(); if (genericType == typeof(ICollection <>)) { Type[] parameters = interfaceType.GetGenericArguments(); Type argumentType = parameters[0]; parameters[0] = argumentType.MakeArrayType(); ConstructorInfo constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameters, null); if (constructorInfo != null) { if (type.IsValueType) { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeStructCollectionMethod; } else { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeClassCollectionMethod; } break; } parameters[0] = typeof(IList <>).MakeGenericType(argumentType); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameters, null); if (constructorInfo != null) { if (type.IsValueType) { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeStructCollectionMethod; } else { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeClassCollectionMethod; } break; } parameters[0] = typeof(ICollection <>).MakeGenericType(argumentType); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameters, null); if (constructorInfo != null) { if (type.IsValueType) { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeStructCollectionMethod; } else { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeClassCollectionMethod; } break; } parameters[0] = typeof(IEnumerable <>).MakeGenericType(argumentType); constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, parameters, null); if (constructorInfo != null) { if (type.IsValueType) { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeStructCollectionMethod; } else { collectionDelegate = CollectionGenericType2.Get(type, argumentType).BinaryDeSerializeClassCollectionMethod; } break; } } else if (genericType == typeof(IDictionary <,>)) { ConstructorInfo constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { interfaceType }, null); if (constructorInfo != null) { Type[] parameters = interfaceType.GetGenericArguments(); if (type.IsValueType) { collectionDelegate = DictionaryGenericType3.Get(type, parameters[0], parameters[1]).BinaryDeSerializeStructDictionaryMethod; } else { collectionDelegate = DictionaryGenericType3.Get(type, parameters[0], parameters[1]).BinaryDeSerializeClassDictionaryMethod; } break; } } } } if (collectionDelegate != null) { DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)collectionDelegate; return; } if (type.IsValueType) { isValueType = true; } else if (attribute != BinarySerializer.DefaultAttribute && attributeType != type) { for (Type baseType = type.BaseType; baseType != typeof(object); baseType = baseType.BaseType) { BinarySerializeAttribute baseAttribute = baseType.customAttribute <BinarySerializeAttribute>(); if (baseAttribute != null) { if (baseAttribute.IsBaseType) { methodInfo = DeSerializeMethodCache.BaseSerializeMethod.MakeGenericMethod(baseType, type); DefaultDeSerializer = (BinaryDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(BinaryDeSerializer.DeSerializeDelegate <T>), methodInfo); return; } break; } } } LeftArray <DeSerializeVersionField> attributeFields = new LeftArray <DeSerializeVersionField>(0); if ((attribute.MemberFilters & MemberFilters.PublicInstanceField) != 0) { appendField(ref attributeFields, MemberIndexGroup <T> .Group.PublicFields); } else { foreach (FieldIndex field in MemberIndexGroup <T> .Group.PublicFields) { attributeFields.Add(new DeSerializeVersionField { Field = field }); } } if ((attribute.MemberFilters & MemberFilters.NonPublicInstanceField) != 0) { appendField(ref attributeFields, MemberIndexGroup <T> .Group.NonPublicFields); } if (attribute.IsAnonymousFields) { appendField(ref attributeFields, MemberIndexGroup <T> .Group.AnonymousFields); } foreach (FieldIndex field in new MemberIndexGroup(type, true).NonPublicFields) { Type fieldType = field.Member.FieldType; if (!fieldType.IsPointer && (!fieldType.IsArray || fieldType.GetArrayRank() == 1) && !field.IsIgnore && !typeof(Delegate).IsAssignableFrom(fieldType)) { BinarySerializeMemberAttribute memberAttribute = field.GetAttribute <BinarySerializeMemberAttribute>(true); if (memberAttribute != null && memberAttribute.IsSetup && memberAttribute.RemoveGlobalVersion != memberAttribute.GlobalVersion) { attributeFields.Add(new DeSerializeVersionField { Field = field, Attribute = memberAttribute }); if (memberAttribute.IsRemove) { attributeFields.Add(new DeSerializeVersionField { Field = field, Attribute = memberAttribute, IsRemove = true }); } } } } isMemberMap = attribute.GetIsMemberMap; isJson = attribute.GetIsJson; uint globalVersion = 0, removeMemberCount = 0; int noSerializeMemberCount = 0; LeftArray <DeSerializeVersionFields <T> > deSerializeVersionFields = new LeftArray <DeSerializeVersionFields <T> >(0); LeftArray <DeSerializeVersionField> attributeVersionFields = new LeftArray <DeSerializeVersionField>(attributeFields.Length); foreach (DeSerializeVersionField field in attributeFields.Sort(DeSerializeVersionField.GlobalVersionSort)) { if (field.GlobalVersion != globalVersion) { deSerializeVersionFields.Add(new DeSerializeVersionFields <T>(globalVersion, attributeVersionFields.GetArray(), removeMemberCount, noSerializeMemberCount)); globalVersion = field.GlobalVersion; } if (field.IsRemove) { attributeVersionFields.RemoveToEnd(value => object.ReferenceEquals(value.Field, field.Field)); if (field.Attribute.IsRemove) { --removeMemberCount; } } else { attributeVersionFields.Add(field); if (field.Attribute != null) { if (field.Attribute.IsRemove) { ++removeMemberCount; } } else { ++noSerializeMemberCount; } } } fieldDeSerializer = new DeSerializeVersionFields <T>(globalVersion, attributeVersionFields.GetArray(), removeMemberCount, noSerializeMemberCount).CreateOnly(attribute); if (deSerializeVersionFields.Length != 0) { int count = deSerializeVersionFields.Length; DeSerializeVersionFields <T>[] deSerializeVersionFieldsArray = new DeSerializeVersionFields <T> [count]; foreach (DeSerializeVersionFields <T> value in deSerializeVersionFields) { deSerializeVersionFieldsArray[--count] = value; deSerializeVersionFieldsArray[count].CreateLock = new object(); } fieldDeSerializers = deSerializeVersionFieldsArray; } }