/// <summary> /// 真实类型 /// </summary> /// <param name="deSerializer">二进制数据反序列化</param> /// <param name="value">数据对象</param> private static void realType(BinaryDeSerializer deSerializer, ref T value) { AutoCSer.Reflection.RemoteType remoteType = default(AutoCSer.Reflection.RemoteType); TypeDeSerializer <AutoCSer.Reflection.RemoteType> .GetDeSerializer(deSerializer.GlobalVersion).MemberDeSerialize(deSerializer, ref remoteType); if (deSerializer.State == DeSerializeState.Success) { Type type; if (remoteType.TryGet(out type)) { if (value == null || type.IsValueType) { //value = (valueType)DeSerializeMethodCache.GetRealDeSerializer(type)(deSerializer, value); value = (T)GenericType.Get(type).BinaryDeSerializeRealTypeObjectDelegate(deSerializer, value); } //else DeSerializeMethodCache.GetRealDeSerializer(type)(deSerializer, value); else { GenericType.Get(type).BinaryDeSerializeRealTypeObjectDelegate(deSerializer, value); } } else { deSerializer.State = DeSerializeState.RemoteTypeError; } } }
internal static void BaseDeSerialize <childType>(BinaryDeSerializer deSerializer, ref childType value) where childType : T { if (value == null) { value = AutoCSer.Metadata.DefaultConstructor <childType> .Constructor(); } T newValue = value; classDeSerialize(deSerializer, ref newValue); }
internal static void StructDeSerialize(BinaryDeSerializer deSerializer, ref T value) { if (DefaultDeSerializer == null) { GetDeSerializer(deSerializer.GlobalVersion).MemberDeSerialize(deSerializer, ref value); } else { DefaultDeSerializer(deSerializer, ref value); } }
internal static void DeSerializeTcpServer(BinaryDeSerializer deSerializer, ref T value) { if (DefaultDeSerializer == null) { GetDeSerializer(deSerializer.GlobalVersion).deSerializeTcpServer(deSerializer, ref value); } else { DefaultDeSerializer(deSerializer, ref value); } }
public unsafe static DeSerializeResult deSerialize <T>(this T value, UnmanagedStream data, int startIndex = 0, DeSerializeConfig config = null) { if (data == null) { return new DeSerializeResult { State = DeSerializeState.UnknownData } } ; return(BinaryDeSerializer.DeSerialize <T>(null, data.Data.Byte + startIndex, data.Data.CurrentIndex - startIndex, ref value, config)); }
internal static void DeSerialize(BinaryDeSerializer deSerializer, ref T value) { if (isValueType) { StructDeSerialize(deSerializer, ref value); } else { ClassDeSerialize(deSerializer, ref value); } }
private static void classDeSerialize(BinaryDeSerializer deSerializer, ref T value) { if (DefaultDeSerializer == null) { deSerializer.AddPoint(ref value); GetDeSerializer(deSerializer.GlobalVersion).MemberDeSerialize(deSerializer, ref value); } else { DefaultDeSerializer(deSerializer, ref value); } }
public unsafe static DeSerializeResult deSerialize <T>(this T value, ref LeftArray <byte> data, DeSerializeConfig config = null) { if (data.Length == 0) { return new DeSerializeResult { State = DeSerializeState.UnknownData } } ; fixed(byte *dataFixed = data.GetFixedBuffer()) return(BinaryDeSerializer.DeSerialize <T>(data.Array, dataFixed, data.Length, ref value, config)); }
public unsafe static DeSerializeResult deSerialize <T>(this T value, byte *data, int size, DeSerializeConfig config = null) { if (data == null) { return new DeSerializeResult { State = DeSerializeState.UnknownData } } ; return(BinaryDeSerializer.DeSerialize <T>(null, data, size, ref value, config)); } }
private static void noConstructor(BinaryDeSerializer deSerializer, ref T value) { //if (deSerializer.IsObjectRealType) deSerializer.State = DeSerializeState.NotNull; //else realType(deSerializer, ref value); if (deSerializer.IsObjectRealType) { realType(deSerializer, ref value); } else { deSerializer.State = DeSerializeState.NotNull; } }
internal static void ClassDeSerialize(BinaryDeSerializer deSerializer, ref T value) { if (deSerializer.CheckPoint(ref value)) { if (deSerializer.IsRealType()) { realType(deSerializer, ref value); } else { classDeSerialize(deSerializer, ref value); } } }
/// <summary> /// 对象序列化 /// </summary> /// <param name="deSerializer">二进制数据反序列化</param> /// <param name="value">数据对象</param> internal void MemberDeSerialize(BinaryDeSerializer deSerializer, ref T value) { if (deSerializer.CheckMemberCount(memberCountVerify)) { fixedMemberDeSerializer(deSerializer, ref value); deSerializer.Read += fixedFillSize; if (memberDeSerializer != null) { memberDeSerializer(deSerializer, ref value); } if (isJson || jsonMemberMap != null) { deSerializer.DeSerializeJson(ref value); } } else if (isMemberMap) { MemberMap memberMap = deSerializer.GetMemberMap <T>(); if (memberMap != null) { byte *start = deSerializer.Read; fixedMemberMapDeSerializer(memberMap, deSerializer, ref value); deSerializer.Read += (int)(start - deSerializer.Read) & 3; if (memberMapDeSerializer != null) { memberMapDeSerializer(memberMap, deSerializer, ref value); } if (isJson) { deSerializer.DeSerializeJson(ref value); } else if (jsonMemberMap != null) { foreach (int memberIndex in jsonMemberIndexs) { if (memberMap.IsMember(memberIndex)) { deSerializer.DeSerializeJson(ref value); return; } } } } } else { deSerializer.State = DeSerializeState.MemberMap; } }
/// <summary> /// 添加字段 /// </summary> /// <param name="field">字段信息</param> public void Push(FieldSize field) { Label end = generator.DefineLabel(); generator.memberMapIsMember(OpCodes.Ldarg_0, field.MemberIndex); generator.Emit(OpCodes.Brfalse_S, end); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_2); if (!isValueType) { generator.Emit(OpCodes.Ldind_Ref); } generator.Emit(OpCodes.Ldflda, field.Field); generator.call(BinaryDeSerializer.GetMemberMapDeSerializeMethod(field.Field.FieldType) ?? DeSerializeMethodCache.GetMember(field.Field.FieldType)); generator.MarkLabel(end); }
/// <summary> /// 对象反序列化 /// </summary> /// <param name="deSerializer">二进制数据反序列化</param> /// <param name="value">数据对象</param> private void deSerializeTcpServer(BinaryDeSerializer deSerializer, ref T value) { if (deSerializer.CheckMemberCount(memberCountVerify)) { fixedMemberDeSerializer(deSerializer, ref value); deSerializer.Read += fixedFillSize; if (memberDeSerializer != null) { memberDeSerializer(deSerializer, ref value); } if (isJson || jsonMemberMap != null) { deSerializer.DeSerializeJson(ref value); } } else { deSerializer.State = DeSerializeState.MemberMap; } }
/// <summary> Registers a binary de/serializer for the specified property type with the specified ID. </summary> /// <exception cref="ArgumentOutOfRangeException"> Thrown if the specified ID is outside the valid range (MIN_ID - MAX_ID). </exception> /// <exception cref="ArgumentNullException"> Thrown if the specified de/serializer is null. </exception> /// <exception cref="InvalidOperationException"> Thrown if the specified ID is already used. </exception> public static void Register <TProperty>(int id, BinaryDeSerializer <TProperty> deSerializer) where TProperty : IProperty { if ((id < MIN_ID) || (id > MAX_ID)) { throw new ArgumentOutOfRangeException(nameof(id), $"The ID { id } is not within the valid range ({ MIN_ID } - { MAX_ID })"); } if (deSerializer == null) { throw new ArgumentNullException(nameof(deSerializer)); } if (_byID[id] != null) { throw new InvalidOperationException( $"The ID { id } is already in use by de/serializer '{ _byID[id].GetType().ToFriendlyName() }'"); } _byID[id] = deSerializer; _byType.Add(typeof(TProperty), Tuple.Create(id, (IBinaryDeSerializer)deSerializer)); }
/// <summary> /// 添加字段 /// </summary> /// <param name="field">字段信息</param> public void Push(FieldSize field) { Type fieldType = field.Field.FieldType; generator.Emit(OpCodes.Ldarg_0); if (field.Field.IsStatic) { LocalBuilder staticMember = generator.DeclareLocal(fieldType); generator.initobj(fieldType, staticMember); generator.Emit(OpCodes.Ldloca, staticMember); } else { generator.Emit(OpCodes.Ldarg_1); if (!isValueType) { generator.Emit(OpCodes.Ldind_Ref); } generator.Emit(OpCodes.Ldflda, field.Field); } generator.call(BinaryDeSerializer.GetMemberDeSerializeMethod(fieldType) ?? DeSerializeMethodCache.GetMember(fieldType)); }
private static void fromNull(BinaryDeSerializer deSerializer, ref T value) { deSerializer.CheckNull(); value = default(T); }
public static DeSerializeResult deSerialize <T>(this T value, byte[] data, DeSerializeConfig config = null) { return(BinaryDeSerializer.DeSerialize(data, ref value, config)); }
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; } }