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)); } } }
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())); } } }
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); } } }