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