Пример #1
0
        private void ProcessComplexSerializerMembers(TypeReference type, SerializableTypeInfo serializableTypeInfo, string profile = "Default")
        {
            // Process base type (for complex serializers)
            // If it's a closed type and there is a serializer, we'll serialize parent
            SerializableTypeInfo parentSerializableTypeInfo;
            var parentType = ResolveGenericsVisitor.Process(type, type.Resolve().BaseType);

            if (!parentType.ContainsGenericParameter() && (parentSerializableTypeInfo = GenerateSerializer(parentType, false, profile)) != null &&
                parentSerializableTypeInfo.SerializerType != null)
            {
                serializableTypeInfo.ComplexSerializerProcessParentType = true;
            }

            // Process members
            foreach (var serializableItem in ComplexClassSerializerGenerator.GetSerializableItems(type, true))
            {
                var resolvedType = serializableItem.Type.Resolve();
                // Check that all closed types have a proper serializer
                if (serializableItem.Attributes.Any(x => x.AttributeType.FullName == "SiliconStudio.Core.DataMemberCustomSerializerAttribute") ||
                    (resolvedType != null && resolvedType.IsInterface) ||
                    serializableItem.Type.ContainsGenericParameter())
                {
                    continue;
                }

                if (GenerateSerializer(serializableItem.Type, profile: profile) == null)
                {
                    throw new InvalidOperationException(string.Format("Member {0} (type: {1}) doesn't seem to have a valid serializer.", serializableItem.MemberInfo, serializableItem.Type.ConvertCSharp()));
                }
            }
        }
Пример #2
0
        private void ProcessComplexSerializerMembers(TypeReference type, SerializableTypeInfo serializableTypeInfo, string profile = "Default")
        {
            // Process base type (for complex serializers)
            // If it's a closed type and there is a serializer, we'll serialize parent
            SerializableTypeInfo parentSerializableTypeInfo;
            var parentType = ResolveGenericsVisitor.Process(type, type.Resolve().BaseType);

            if (!parentType.ContainsGenericParameter() && (parentSerializableTypeInfo = GenerateSerializer(parentType, false, profile)) != null &&
                parentSerializableTypeInfo.SerializerType != null)
            {
                serializableTypeInfo.ComplexSerializerProcessParentType = true;
            }

            // Process members
            foreach (var serializableItem in ComplexClassSerializerGenerator.GetSerializableItems(type, true))
            {
                var resolvedType = serializableItem.Type.Resolve();
                // Check that all closed types have a proper serializer
                if (serializableItem.Attributes.Any(x => x.AttributeType.FullName == "SiliconStudio.Core.DataMemberCustomSerializerAttribute") ||
                    (resolvedType != null && resolvedType.IsInterface) ||
                    serializableItem.Type.ContainsGenericParameter())
                {
                    continue;
                }

                if (GenerateSerializer(serializableItem.Type, profile: profile) == null)
                {
                    ComplexClassSerializerGenerator.IgnoreMember(serializableItem.MemberInfo);
                    log.Log(new LogMessage(log.Module, LogMessageType.Warning, string.Format("Member {0} does not have a valid serializer. Add [DataMemberIgnore], turn the member non-public, or add a [DataContract] to it's type.", serializableItem.MemberInfo)));
                }
            }
        }
Пример #3
0
        private SerializableTypeInfo CreateComplexSerializer(TypeReference type)
        {
            // Create a fake TypeReference (even though it doesn't really exist yet, but at least ConvertCSharp to get its name will work).
            var dataSerializerType = new TypeReference("SiliconStudio.DataSerializers",
                                                       ComplexClassSerializerGenerator.SerializerTypeName(type, false, true), type.Module, type.Scope);
            var mode = DataSerializerGenericMode.None;

            if (type.HasGenericParameters)
            {
                mode = DataSerializerGenericMode.GenericArguments;

                // Clone generic parameters
                foreach (var genericParameter in type.GenericParameters)
                {
                    var newGenericParameter = new GenericParameter(genericParameter.Name, dataSerializerType)
                    {
                        Attributes = genericParameter.Attributes
                    };

                    // Clone type constraints (others will be in Attributes)
                    foreach (var constraint in genericParameter.Constraints)
                    {
                        newGenericParameter.Constraints.Add(constraint);
                    }

                    dataSerializerType.GenericParameters.Add(newGenericParameter);
                }
            }

            var isLocal = type.Resolve().Module.Assembly == Assembly;
            var serializableTypeInfo = new SerializableTypeInfo(dataSerializerType, true, mode);

            serializableTypeInfo.Local = type.Resolve().Module.Assembly == Assembly;
            AddSerializableType(type, serializableTypeInfo);

            if (isLocal && type is TypeDefinition)
            {
                ComplexTypes.Add((TypeDefinition)type, serializableTypeInfo);
            }

            serializableTypeInfo.ComplexSerializer = true;

            return(serializableTypeInfo);
        }