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

◆ WriteDerivedSerializable()

void System.Xml.Serialization.XmlSerializationReaderILGen.WriteDerivedSerializable ( SerializableMapping head,
SerializableMapping mapping,
string source,
bool isWrappedAny )
inlineprivate

Definition at line 2675 of file XmlSerializationReaderILGen.cs.

2676 {
2677 if (mapping == null)
2678 {
2679 return;
2680 }
2681 for (SerializableMapping serializableMapping = mapping.DerivedMappings; serializableMapping != null; serializableMapping = serializableMapping.NextDerivedMapping)
2682 {
2685 LocalBuilder local = ilg.GetLocal("tser");
2686 ilg.InitElseIf();
2687 ilg.Ldloc(local);
2688 ilg.Load(null);
2689 ilg.Ceq();
2690 ilg.Brtrue(label);
2691 WriteQNameEqual("tser", serializableMapping.XsiType.Name, serializableMapping.XsiType.Namespace);
2692 ilg.Br_S(label2);
2694 ilg.Ldc(boolVar: true);
2696 ilg.AndIf();
2697 if (serializableMapping.Type != null)
2698 {
2699 if (head.Type.IsAssignableFrom(serializableMapping.Type))
2700 {
2701 WriteSourceBeginTyped(source, head.TypeDesc);
2702 MethodInfo method = typeof(XmlSerializationReader).GetMethod("ReadSerializable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, (!isWrappedAny) ? new Type[1] { typeof(IXmlSerializable) } : new Type[2]
2703 {
2704 typeof(IXmlSerializable),
2705 typeof(bool)
2706 });
2707 ilg.Ldarg(0);
2708 base.RaCodeGen.ILGenForCreateInstance(ilg, serializableMapping.TypeDesc.Type, serializableMapping.TypeDesc.CannotNew, cast: false);
2709 if (serializableMapping.TypeDesc.CannotNew)
2710 {
2711 ilg.ConvertValue(typeof(object), typeof(IXmlSerializable));
2712 }
2713 if (isWrappedAny)
2714 {
2715 ilg.Ldc(boolVar: true);
2716 }
2717 ilg.Call(method);
2718 if (head.TypeDesc != null)
2719 {
2720 ilg.ConvertValue(typeof(IXmlSerializable), head.TypeDesc.Type);
2721 }
2722 WriteSourceEnd(source, head.TypeDesc.Type);
2723 }
2724 else
2725 {
2726 MethodInfo method2 = typeof(XmlSerializationReader).GetMethod("CreateBadDerivationException", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[6]
2727 {
2728 typeof(string),
2729 typeof(string),
2730 typeof(string),
2731 typeof(string),
2732 typeof(string),
2733 typeof(string)
2734 });
2735 ilg.Ldarg(0);
2737 ilg.Ldstr(GetCSharpString(serializableMapping.XsiType.Namespace));
2738 ilg.Ldstr(GetCSharpString(head.XsiType.Name));
2739 ilg.Ldstr(GetCSharpString(head.XsiType.Namespace));
2741 ilg.Ldstr(GetCSharpString(head.Type.FullName));
2742 ilg.Call(method2);
2743 ilg.Throw();
2744 }
2745 }
2746 else
2747 {
2748 MethodInfo method3 = typeof(XmlSerializationReader).GetMethod("CreateMissingIXmlSerializableType", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, new Type[3]
2749 {
2750 typeof(string),
2751 typeof(string),
2752 typeof(string)
2753 });
2754 ilg.Ldarg(0);
2756 ilg.Ldstr(GetCSharpString(serializableMapping.XsiType.Namespace));
2757 ilg.Ldstr(GetCSharpString(head.Type.FullName));
2758 ilg.Call(method3);
2759 ilg.Throw();
2760 }
2762 }
2763 }
void ConvertValue(Type source, Type target)
void Call(MethodInfo methodInfo)
LocalBuilder GetLocal(string name)
void Ldloc(LocalBuilder localBuilder)
void WriteDerivedSerializable(SerializableMapping head, SerializableMapping mapping, string source, bool isWrappedAny)
void WriteQNameEqual(string source, string name, string ns)

References System.Xml.Dictionary, System.Type.FullName, System.Type.IsAssignableFrom(), System.Xml.XmlQualifiedName.Name, System.Xml.XmlQualifiedName.Namespace, System.source, System.Xml.Serialization.SerializableMapping.Type, System.Xml.Serialization.TypeDesc.Type, System.Xml.Serialization.TypeMapping.TypeDesc, and System.Xml.Serialization.SerializableMapping.XsiType.