internal static MessagePackSerializer <T> CreateReflectionInternal <T>(SerializationContext context, Type concreteType, PolymorphismSchema schema)
        {
            if (concreteType.GetIsAbstract() || concreteType.GetIsInterface())
            {
                // return null for polymoirphic provider.
                return(null);
            }

            var serializer = context.Serializers.Get <T>(context);

            if (serializer != null)
            {
                // For MessagePack.Create compatibility.
                // Required for built-in types.
                return(serializer);
            }

            ValidateType(typeof(T));
            var traits = typeof(T).GetCollectionTraits();

            switch (traits.CollectionType)
            {
            case CollectionKind.Array:
            case CollectionKind.Map:
            {
                return
                    (#if !UNITY
                     ReflectionSerializerHelper.CreateCollectionSerializer <T>(context, concreteType, traits, (schema ?? PolymorphismSchema.Default)));
#else
                     Wrap <T>(
                         context,
                         ReflectionSerializerHelper.CreateCollectionSerializer <T>(context, concreteType, traits, (schema ?? PolymorphismSchema.Default))
                         );
#endif // !UNITY
            }

            default:
            {
                if (typeof(T).GetIsEnum())
                {
                    return(ReflectionSerializerHelper.CreateReflectionEnumMessagePackSerializer <T>(context));
                }
#if !WINDOWS_PHONE && !NETFX_35 && !UNITY
                if (TupleItems.IsTuple(typeof(T)))
                {
                    return
                        (new ReflectionTupleMessagePackSerializer <T>(
                             context,
                             (schema ?? PolymorphismSchema.Default).ChildSchemaList
                             ));
                }
#endif // !WINDOWS_PHONE && !NETFX_35 && !UNITY

                return(new ReflectionObjectMessagePackSerializer <T>(context));
            }
            }
        }
        internal static MessagePackSerializer <T> CreateReflectionInternal <T>(SerializationContext context)
        {
            var serializer = context.Serializers.Get <T>(context);

            if (serializer != null)
            {
                // For MessagePack.Create compatibility.
                // Required for built-in types.
                return(serializer);
            }

            var traits = typeof(T).GetCollectionTraits();

            switch (traits.CollectionType)
            {
            case CollectionKind.Array:
            {
                return(ReflectionSerializerHelper.CreateArraySerializer <T>(context, EnsureConcreteTypeRegistered(context, typeof(T)), traits));
            }

            case CollectionKind.Map:
            {
                return(ReflectionSerializerHelper.CreateMapSerializer <T>(context, EnsureConcreteTypeRegistered(context, typeof(T)), traits));
            }

            default:
            {
                if (typeof(T).GetIsEnum())
                {
                    return(ReflectionSerializerHelper.CreateReflectionEnuMessagePackSerializer <T>(context));
                }
#if !WINDOWS_PHONE && !NETFX_35 && !UNITY
                if ((typeof(T).GetAssembly().Equals(typeof(object).GetAssembly()) ||
                     typeof(T).GetAssembly().Equals(typeof(Enumerable).GetAssembly())) &&
                    typeof(T).GetIsPublic() &&
                    typeof(T).Name.StartsWith("Tuple`", StringComparison.Ordinal))
                {
                    return(new ReflectionTupleMessagePackSerializer <T>(context));
                }
#endif // !WINDOWS_PHONE && !NETFX_35 && !UNITY

                return(new ReflectionObjectMessagePackSerializer <T>(context));
            }
            }
        }
예제 #3
0
        internal static MessagePackSerializer <T> CreateReflectionInternal <T>(SerializationContext context, Type concreteType, PolymorphismSchema schema)
        {
            if (concreteType.GetIsAbstract() || concreteType.GetIsInterface())
            {
                // return null for polymoirphic provider.
                return(null);
            }

            var serializer = context.Serializers.Get <T>(context);

            if (serializer != null)
            {
                // For MessagePack.Create compatibility.
                // Required for built-in types.
                return(serializer);
            }

            ValidateType(typeof(T));
            var traits =
#if !UNITY
                typeof(T).GetCollectionTraits(CollectionTraitOptions.WithAddMethod, context.CompatibilityOptions.AllowNonCollectionEnumerableTypes);
#else
                typeof(T).GetCollectionTraits(CollectionTraitOptions.WithAddMethod | CollectionTraitOptions.WithCountPropertyGetter, context.CompatibilityOptions.AllowNonCollectionEnumerableTypes);
#endif
            switch (traits.CollectionType)
            {
            case CollectionKind.Array:
            case CollectionKind.Map:
            {
                return
                    (#if !UNITY
                     ReflectionSerializerHelper.CreateCollectionSerializer <T>(context, concreteType, traits, (schema ?? PolymorphismSchema.Default)));
#else
                     Wrap <T>(
                         context,
                         ReflectionSerializerHelper.CreateCollectionSerializer <T>(context, concreteType, traits, (schema ?? PolymorphismSchema.Default))
                         );
#endif // !UNITY
            }

            default:
            {
                if (typeof(T).GetIsEnum())
                {
                    return(ReflectionSerializerHelper.CreateReflectionEnumMessagePackSerializer <T>(context));
                }
#if !NET35 && !UNITY
                if (TupleItems.IsTuple(typeof(T)))
                {
                    return
                        (new ReflectionTupleMessagePackSerializer <T>(
                             context,
                             (schema ?? PolymorphismSchema.Default).ChildSchemaList
                             ));
                }
#endif // !NET35 && !UNITY

                SerializationTarget.VerifyType(typeof(T));
                var target = SerializationTarget.Prepare(context, typeof(T));
                return(new ReflectionObjectMessagePackSerializer <T>(context, target, target.GetCapabilitiesForObject()));
            }
            }
        }
예제 #4
0
        private static void VerifyType(Type type, string[] expectedMemberNames, string[] readOnlyMembers)
        {
            var context = new SerializationContext();
            var target  = SerializationTarget.Prepare(context, type);

            Assert.That(
                target.Members.Count,
                Is.EqualTo(expectedMemberNames.Length),
                "Some members are lacked.{0}  Expected:[{1}]{0}  Actual  :[{2}]",
                Environment.NewLine,
                String.Join(", ", expectedMemberNames),
                String.Join(", ", target.Members.Select(m => String.Format("{{Name: {0}, Contract: {{Name: {1}, Id: {2}, NilImplication: {3}}}, Member: '{4}'}}", m.MemberName, m.Contract.Name, m.Contract.Id, m.Contract.NilImplication, m.Member)).ToArray())
                );

            for (var i = 0; i < expectedMemberNames.Length; i++)
            {
                Assert.That(
                    target.Members[i].MemberName,
                    Is.EqualTo(expectedMemberNames[i]),
                    "Member at index {1} is differ.{0}  Expected:[{2}]{0}  Actual  :[{3}]",
                    Environment.NewLine,
                    i,
                    String.Join(", ", expectedMemberNames),
                    String.Join(", ", target.Members.Select(m => m.MemberName + "@Id=" + m.Contract.Id).ToArray())
                    );
            }

            Func <object, object>[]   getters;
            Action <object, object>[] setters;
            MemberInfo[]            memberInfos;
            DataMemberContract[]    contracts;
            MessagePackSerializer[] serializers;
            ReflectionSerializerHelper.GetMetadata(type, target.Members, context, out getters, out setters, out memberInfos, out contracts, out serializers);

            Assert.That(getters.Length, Is.EqualTo(target.Members.Count), "getters.Length");
            Assert.That(setters.Length, Is.EqualTo(target.Members.Count), "setters.Length");
            Assert.That(memberInfos.Length, Is.EqualTo(target.Members.Count), "memberInfos.Length");
            Assert.That(contracts.Length, Is.EqualTo(target.Members.Count), "contracts.Length");
            Assert.That(serializers.Length, Is.EqualTo(target.Members.Count), "serializers.Length");

            for (var i = 0; i < expectedMemberNames.Length; i++)
            {
                if (expectedMemberNames[i] == null)
                {
                    Assert.That(getters[i], Is.Null, "getters[{0}]", i);
                    Assert.That(setters[i], Is.Null, "setters[{0}]", i);
                    Assert.That(memberInfos[i], Is.Null, "memberInfos[{0}]", i);
                    Assert.That(contracts[i].Name, Is.Null, "contracts[{0}]", i);
                    Assert.That(serializers[i], Is.Null, "serializers[{0}]", i);
                }
                else
                {
                    Assert.That(getters[i], Is.Not.Null, "getters[{0}]", i);
                    if (readOnlyMembers.Contains(expectedMemberNames[i]))
                    {
                        Assert.That(setters[i], Is.Null, "setters[{0}]", i);
                    }
                    else
                    {
                        Assert.That(setters[i], Is.Not.Null, "setters[{0}]", i);
                    }
                    Assert.That(memberInfos[i], Is.Not.Null, "memberInfos[{0}]", i);
                    Assert.That(contracts[i].Name, Is.Not.Null, "contracts[{0}]", i);
                    Assert.That(serializers[i], Is.Not.Null, "serializers[{0}]", i);
                }
            }
        }