public static void GetMetadata( Type targetType, IList <SerializingMember> members, SerializationContext context, out Func <object, object>[] getters, out Action <object, object>[] setters, out MemberInfo[] memberInfos, out DataMemberContract[] contracts, out MessagePackSerializer[] serializers ) { SerializationTarget.VerifyCanSerializeTargetType(context, targetType); if (members.Count == 0) { if (!typeof(IPackable).IsAssignableFrom(targetType)) { throw new SerializationException( String.Format( CultureInfo.CurrentCulture, "At least one serializable member is required because type '{0}' does not implement IPackable interface.", targetType ) ); } if (!typeof(IUnpackable).IsAssignableFrom(targetType)) { throw new SerializationException( String.Format( CultureInfo.CurrentCulture, "At least one serializable member is required because type '{0}' does not implement IUnpackable interface.", targetType ) ); } #if FEATURE_TAP if (context.SerializerOptions.WithAsync) { if (!typeof(IAsyncPackable).IsAssignableFrom(targetType)) { throw new SerializationException( String.Format( CultureInfo.CurrentCulture, "At least one serializable member is required because type '{0}' does not implement IAsyncPackable interface.", targetType ) ); } if (!typeof(IAsyncUnpackable).IsAssignableFrom(targetType)) { throw new SerializationException( String.Format( CultureInfo.CurrentCulture, "At least one serializable member is required because type '{0}' does not implement IAsyncUnpackable interface.", targetType ) ); } } #endif // FEATURE_TAP } getters = new Func <object, object> [members.Count]; setters = new Action <object, object> [members.Count]; memberInfos = new MemberInfo[members.Count]; contracts = new DataMemberContract[members.Count]; serializers = new MessagePackSerializer[members.Count]; for (var i = 0; i < members.Count; i++) { var member = members[i]; if (member.Member == null) { // Missing member exist because of unconbinous Id of MessagePackMember or Order of DataMember. #if UNITY contracts[i] = DataMemberContract.Null; #endif // UNITY continue; } FieldInfo asField; if ((asField = member.Member as FieldInfo) != null) { if (context.SerializerOptions.DisablePrivilegedAccess && !asField.GetIsPublic()) { continue; } getters[i] = asField.GetValue; if (!asField.IsInitOnly) { setters[i] = asField.SetValue; } } else { var property = member.Member as PropertyInfo; #if DEBUG Contract.Assert(property != null, "member.Member is PropertyInfo"); #endif // DEBUG if (context.SerializerOptions.DisablePrivilegedAccess && !property.GetIsPublic()) { continue; } var getter = property.GetGetMethod(true); if (getter == null) { ThrowMissingGetterException(targetType, i, property); } getters[i] = target => getter.InvokePreservingExceptionType(target, null); var setter = property.GetSetMethod(true); if (setter != null && (!context.SerializerOptions.DisablePrivilegedAccess || setter.GetIsPublic())) { setters[i] = (target, value) => setter.InvokePreservingExceptionType(target, new[] { value }); } } memberInfos[i] = member.Member; #if !UNITY contracts[i] = member.Contract; #else contracts[i] = member.Contract ?? DataMemberContract.Null; #endif // !UNITY var memberType = member.Member.GetMemberValueType(); if (memberType.GetIsEnum()) { serializers[i] = context.GetSerializer( memberType, EnumMessagePackSerializerHelpers.DetermineEnumSerializationMethod( context, memberType, member.GetEnumMemberSerializationMethod() ) ); } else if (DateTimeMessagePackSerializerHelpers.IsDateTime(memberType)) { serializers[i] = context.GetSerializer( memberType, DateTimeMessagePackSerializerHelpers.DetermineDateTimeConversionMethod( context, member.GetDateTimeMemberConversionMethod() ) ); } else { serializers[i] = context.GetSerializer(memberType, PolymorphismSchema.Create(memberType, member)); } } }
public static void GetMetadata( IList <SerializingMember> members, SerializationContext context, out Func <object, object>[] getters, out Action <object, object>[] setters, out MemberInfo[] memberInfos, out DataMemberContract[] contracts, out IMessagePackSerializer[] serializers) { getters = new Func <object, object> [members.Count]; setters = new Action <object, object> [members.Count]; memberInfos = new MemberInfo[members.Count]; contracts = new DataMemberContract[members.Count]; serializers = new IMessagePackSerializer[members.Count]; for (var i = 0; i < members.Count; i++) { var member = members[i]; if (member.Member == null) { #if UNITY contracts[i] = DataMemberContract.Null; #endif // UNITY continue; } FieldInfo asField; if ((asField = member.Member as FieldInfo) != null) { getters[i] = asField.GetValue; setters[i] = asField.SetValue; } else { var property = member.Member as PropertyInfo; #if DEBUG && !UNITY Contract.Assert(property != null, "member.Member is PropertyInfo"); #endif // DEBUG && !UNITY getters[i] = target => property.GetGetMethod(true).InvokePreservingExceptionType(target, null); var setter = property.GetSetMethod(true); if (setter != null) { setters[i] = (target, value) => setter.InvokePreservingExceptionType(target, new[] { value }); } } memberInfos[i] = member.Member; #if !UNITY contracts[i] = member.Contract; #else contracts[i] = member.Contract ?? DataMemberContract.Null; #endif // !UNITY var memberType = member.Member.GetMemberValueType(); if (memberType.GetIsEnum()) { serializers[i] = context.GetSerializer( memberType, EnumMessagePackSerializerHelpers.DetermineEnumSerializationMethod( context, memberType, member.GetEnumMemberSerializationMethod() ) ); } else if (DateTimeMessagePackSerializerHelpers.IsDateTime(memberType)) { serializers[i] = context.GetSerializer( memberType, DateTimeMessagePackSerializerHelpers.DetermineDateTimeConversionMethod( context, member.GetDateTimeMemberConversionMethod() ) ); } else { serializers[i] = context.GetSerializer(memberType, PolymorphismSchema.Create(context, memberType, member)); } } }
public static void GetMetadata( SerializationContext context, Type targetType, out Func <object, object>[] getters, out Action <object, object>[] setters, out MemberInfo[] memberInfos, out DataMemberContract[] contracts, out IMessagePackSerializer[] serializers) { SerializationTarget.VerifyType(targetType); var members = SerializationTarget.Prepare(context, targetType); getters = new Func <object, object> [members.Count]; setters = new Action <object, object> [members.Count]; memberInfos = new MemberInfo[members.Count]; contracts = new DataMemberContract[members.Count]; serializers = new IMessagePackSerializer[members.Count]; for (var i = 0; i < members.Count; i++) { var member = members[i]; if (member.Member == null) { continue; } FieldInfo asField; if ((asField = member.Member as FieldInfo) != null) { getters[i] = asField.GetValue; setters[i] = asField.SetValue; } else { var property = member.Member as PropertyInfo; #if DEBUG && !UNITY Contract.Assert(property != null); #endif // DEBUG && !UNITY getters[i] = target => property.GetGetMethod(true).Invoke(target, null); var setter = property.GetSetMethod(true); if (setter != null) { setters[i] = (target, value) => setter.Invoke(target, new[] { value }); } } memberInfos[i] = member.Member; contracts[i] = member.Contract; var memberType = member.Member.GetMemberValueType(); if (!memberType.GetIsEnum()) { serializers[i] = context.GetSerializer(memberType); } else { serializers[i] = context.GetSerializer( memberType, EnumMessagePackSerializerHelpers.DetermineEnumSerializationMethod( context, memberType, member.GetEnumMemberSerializationMethod() ) ); } } }