Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ GenerateTypedSerializer()

string System.Xml.Serialization.XmlSerializationILGen.GenerateTypedSerializer ( string readMethod,
string writeMethod,
XmlMapping mapping,
CodeIdentifiers classes,
string baseSerializer,
string readerClass,
string writerClass )
inlinepackageinherited

Definition at line 286 of file XmlSerializationILGen.cs.

287 {
288 string text = CodeIdentifier.MakeValid(Accessor.UnescapeName(mapping.Accessor.Mapping.TypeDesc.Name));
289 text = classes.AddUnique(text + "Serializer", mapping);
290 TypeBuilder typeBuilder = CodeGenerator.CreateTypeBuilder(_moduleBuilder, CodeIdentifier.GetCSharpName(text), TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit, CreatedTypes[baseSerializer], Type.EmptyTypes);
291 ilg = new CodeGenerator(typeBuilder);
292 ilg.BeginMethod(typeof(bool), "CanDeserialize", new Type[1] { typeof(XmlReader) }, new string[1] { "xmlReader" }, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig);
293 if (mapping.Accessor.Any)
294 {
298 }
299 else
300 {
301 MethodInfo method = typeof(XmlReader).GetMethod("IsStartElement", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[2]
302 {
303 typeof(string),
304 typeof(string)
305 });
306 ilg.Ldarg(ilg.GetArg("xmlReader"));
307 ilg.Ldstr(GetCSharpString(mapping.Accessor.Name));
308 ilg.Ldstr(GetCSharpString(mapping.Accessor.Namespace));
309 ilg.Call(method);
312 }
315 ilg.EndMethod();
316 if (writeMethod != null)
317 {
318 ilg = new CodeGenerator(typeBuilder);
319 ilg.BeginMethod(typeof(void), "Serialize", new Type[2]
320 {
321 typeof(object),
322 typeof(XmlSerializationWriter)
323 }, new string[2] { "objectToSerialize", "writer" }, MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig);
324 MethodInfo method2 = CreatedTypes[writerClass].GetMethod(writeMethod, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[1] { (mapping is XmlMembersMapping) ? typeof(object[]) : typeof(object) });
325 ilg.Ldarg("writer");
327 ilg.Ldarg("objectToSerialize");
328 if (mapping is XmlMembersMapping)
329 {
330 ilg.ConvertValue(typeof(object), typeof(object[]));
331 }
333 ilg.EndMethod();
334 }
335 if (readMethod != null)
336 {
337 ilg = new CodeGenerator(typeBuilder);
338 ilg.BeginMethod(typeof(object), "Deserialize", new Type[1] { typeof(XmlSerializationReader) }, new string[1] { "reader" }, MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig);
339 MethodInfo method3 = CreatedTypes[readerClass].GetMethod(readMethod, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
340 ilg.Ldarg("reader");
343 ilg.EndMethod();
344 }
347 CreatedTypes.Add(type.Name, type);
348 return type.Name;
349 }
void Add(TKey key, TValue value)
ConstructorBuilder DefineDefaultConstructor(MethodAttributes attributes)
virtual Type AsType()
Definition TypeInfo.cs:106
void ConvertValue(Type source, Type target)
void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes)
void Call(MethodInfo methodInfo)
void Stloc(Type type, string name)
void Ldloc(LocalBuilder localBuilder)

References System.Xml.Serialization.XmlSerializationILGen._moduleBuilder, System.Xml.Serialization.CodeGenerator.BeginMethod(), System.Xml.Serialization.CodeGenerator.Br(), System.Xml.Serialization.CodeGenerator.Call(), System.Xml.Serialization.CodeGenerator.Castclass(), System.Xml.Serialization.CodeGenerator.ConvertValue(), System.Xml.Serialization.XmlSerializationILGen.CreatedTypes, System.Xml.Serialization.CodeGenerator.CreateTypeBuilder(), System.Xml.Dictionary, System.Type.EmptyTypes, System.Xml.Serialization.CodeGenerator.EndMethod(), System.Xml.Serialization.CodeGenerator.GetArg(), System.Xml.Serialization.CodeIdentifier.GetCSharpName(), System.Xml.Serialization.XmlSerializationILGen.GetCSharpString(), System.Xml.Serialization.XmlSerializationILGen.ilg, System.Xml.Serialization.CodeGenerator.Ldarg(), System.Xml.Serialization.CodeGenerator.Ldc(), System.Xml.Serialization.CodeGenerator.Ldloc(), System.Xml.Serialization.CodeGenerator.Ldstr(), System.Xml.Serialization.CodeIdentifier.MakeValid(), System.Xml.Serialization.CodeGenerator.MarkLabel(), System.Xml.Serialization.CodeGenerator.ReturnLabel, System.Xml.Serialization.CodeGenerator.ReturnLocal, System.Xml.Serialization.CodeGenerator.Stloc(), System.text, System.Xml.Serialization.XmlSerializationILGen.typeBuilder, and System.Xml.Serialization.Accessor.UnescapeName().