4 using System.Collections.Generic;
7 using SiliconStudio.Core.Serialization.Serializers;
9 namespace SiliconStudio.AssemblyProcessor.Serializers
16 HashSet<AssemblyDefinition> processedAssemblies =
new HashSet<AssemblyDefinition>();
20 ProcessDataSerializerGlobalAttributes(context, context.Assembly,
true);
23 private void ProcessDataSerializerGlobalAttributes(CecilSerializerContext context, AssemblyDefinition assembly,
bool local)
26 if (!processedAssemblies.Add(assembly))
32 foreach (var referencedAssemblyName
in assembly.MainModule.AssemblyReferences)
36 if (referencedAssemblyName.Name ==
"mscorlib" || referencedAssemblyName.Name.StartsWith(
"System")
37 || referencedAssemblyName.FullName.Contains(
"PublicKeyToken=31bf3856ad364e35"))
40 var referencedAssembly = context.Assembly.MainModule.AssemblyResolver.Resolve(referencedAssemblyName);
41 ProcessDataSerializerGlobalAttributes(context, referencedAssembly,
false);
45 foreach (var dataSerializerAttribute
in
46 assembly.CustomAttributes.Concat(assembly.MainModule.Types.SelectMany(x => x.CustomAttributes)).Where(
47 x => x.AttributeType.FullName ==
"SiliconStudio.Core.Serialization.Serializers.DataSerializerGlobalAttribute")
48 .OrderBy(x => x.ConstructorArguments[0].Value != null ? -1 : 1))
50 var dataSerializerType = (TypeReference)dataSerializerAttribute.ConstructorArguments[0].Value;
51 var dataType = (TypeReference)dataSerializerAttribute.ConstructorArguments[1].Value;
53 var inherited = (
bool)dataSerializerAttribute.ConstructorArguments[3].Value;
54 var complexSerializer = (bool)dataSerializerAttribute.ConstructorArguments[4].Value;
55 var profile = dataSerializerAttribute.Properties.Where(x => x.Name ==
"Profile").Select(x => (string)x.Argument.Value).FirstOrDefault() ??
"Default";
60 dataType = FindSerializerDataType(dataSerializerType);
62 throw new InvalidOperationException(
"Can't deduce data serializer type for generic types.");
65 CecilSerializerContext.SerializableTypeInfo serializableTypeInfo;
67 if (dataSerializerType == null)
70 serializableTypeInfo = context.GenerateSerializer(dataType, profile: profile);
71 if (serializableTypeInfo == null)
72 throw new InvalidOperationException(
string.Format(
"Can't find serializer for type {0}", dataType));
73 serializableTypeInfo.Local = local;
74 serializableTypeInfo.ExistingLocal = local;
75 dataSerializerType = serializableTypeInfo.SerializerType;
80 serializableTypeInfo =
new CecilSerializerContext.SerializableTypeInfo(dataSerializerType, local, mode) { ExistingLocal = local, Inherited = inherited, ComplexSerializer = complexSerializer };
81 context.AddSerializableType(dataType, serializableTypeInfo, profile);
89 TypeReference dataType = null;
90 var dataSerializerTypeCurrent = dataSerializerType;
91 while (dataSerializerTypeCurrent != null)
93 var genericInstanceType = dataSerializerTypeCurrent as GenericInstanceType;
94 if (genericInstanceType != null)
96 if (genericInstanceType.ElementType.FullName ==
"SiliconStudio.Core.Serialization.DataSerializer`1")
98 dataType = genericInstanceType.GenericArguments[0];
103 var baseType = ResolveGenericsVisitor.Process(dataSerializerTypeCurrent, dataSerializerTypeCurrent.Resolve().BaseType);
105 dataSerializerTypeCurrent = baseType;
108 if (dataType == null)
109 throw new InvalidOperationException(
string.Format(
"Could not determine data type for {0}.", dataSerializerType));
static TypeReference FindSerializerDataType(TypeReference dataSerializerType)
DataSerializerGenericMode
Defines what generic parameters to pass to the serializer.
Gives the required generic serializer for a given type. This is useful for generation of serializatio...
void ProcessSerializers(CecilSerializerContext context)
Process serializers for given assembly context.
Fill CecilSerializerContext.SerializableTypes with serializable types handled by referenced assemblie...