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));
                }
            }
        }
Example #2
0
        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));
                }
            }
        }
Example #3
0
        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()
                                )
                            );
                }
            }
        }