/// <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="field">字段信息</param> public void Push(FieldSize field) { generator.Emit(OpCodes.Ldarg_0); if (isValueType) { generator.Emit(OpCodes.Ldarga_S, 1); } else { generator.Emit(OpCodes.Ldarg_1); } generator.Emit(OpCodes.Ldfld, field.Field); generator.call(BinarySerializer.GetMemberSerializeMethod(field.Field.FieldType) ?? SerializeMethodCache.GetMember(field.Field.FieldType)); }
/// <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="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)); }
/// <summary> /// 获取字段成员集合 /// </summary> /// <param name="fieldIndexs"></param> /// <param name="isJson"></param> /// <param name="memberCountVerify"></param> /// <returns>字段成员集合</returns> public static Fields <FieldSize> GetFields(FieldIndex[] fieldIndexs, bool isJson, out int memberCountVerify) { LeftArray <FieldSize> fixedFields = new LeftArray <FieldSize>(fieldIndexs.Length), fields = new LeftArray <FieldSize>(fieldIndexs.Length); LeftArray <FieldIndex> jsonFields = new LeftArray <FieldIndex>(); int fixedSize = 0; foreach (FieldIndex field in fieldIndexs) { Type fieldType = field.Member.FieldType; if (!fieldType.IsPointer && (!fieldType.IsArray || fieldType.GetArrayRank() == 1) && !field.IsIgnore && !typeof(Delegate).IsAssignableFrom(fieldType)) { SerializeMemberAttribute memberAttribute = field.GetAttribute <SerializeMemberAttribute>(true); if (memberAttribute == null || (memberAttribute.IsSetup && !memberAttribute.IsRemove)) { if (memberAttribute != null && memberAttribute.GetIsJson) { jsonFields.Add(field); } else { FieldSize value = new FieldSize(field); if (value.FixedSize == 0) { fields.Add(value); } else { fixedFields.Add(value); fixedSize += value.FixedSize; } } } } } return(new Fields <FieldSize>(ref fixedFields, ref fields, ref jsonFields, fixedSize, isJson, out memberCountVerify)); }
/// <summary> /// 固定分组排序字节数排序比较 /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <returns></returns> internal static int FixedSizeSort(FieldSize left, FieldSize right) { return((int)((uint)right.FixedSize & (0U - (uint)right.FixedSize)) - (int)((uint)left.FixedSize & (0U - (uint)left.FixedSize))); }
/// <summary> /// 设置字段信息 /// </summary> /// <param name="field"></param> internal void Set(FieldSize field) { Field = field.Field; MemberIndex = field.MemberIndex; SerializeMethod = (Action <Serializer, object>) typeof(AutoCSer.Reflection.InvokeMethod <,>).MakeGenericType(typeof(Serializer), Field.FieldType).GetMethod("getTypeObject", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { Serializer.GetMemberMapSerializeMethod(Field.FieldType) ?? SerializeMethodCache.GetMember(Field.FieldType) }); }
/// <summary> /// 设置字段信息 /// </summary> /// <param name="field"></param> internal void Set(FieldSize field) { Field = field.Field; MemberIndex = field.MemberIndex; DeSerializeMethod = (Func <DeSerializer, object, object>) typeof(AutoCSer.Reflection.InvokeMethodRef2 <,>).MakeGenericType(typeof(DeSerializer), Field.FieldType).GetMethod("getTypeObjectReturn", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { DeSerializer.GetMemberDeSerializeMethod(Field.FieldType) ?? DeSerializeMethodCache.GetMember(Field.FieldType) }); }