System.Xml.Serialization.SerializationCodeGenerator.GenerateContract C# (CSharp) Method

GenerateContract() public method

public GenerateContract ( ArrayList generatedMaps ) : void
generatedMaps System.Collections.ArrayList
return void
		public void GenerateContract (ArrayList generatedMaps)
		{
			// Write the base serializer
			
			if (generatedMaps.Count == 0) return;
			
			GenerationResult main = (GenerationResult) generatedMaps[0];
			
			string baseSerializerName = main.BaseSerializerClassName;
			string access_mod = (_config == null || !_config.GenerateAsInternal) ? "public" : "internal";
			
			WriteLine ("");
			WriteLine (access_mod + " class " + baseSerializerName + " : System.Xml.Serialization.XmlSerializer");
			WriteLineInd ("{");
			WriteLineInd ("protected override System.Xml.Serialization.XmlSerializationReader CreateReader () {");
			WriteLine ("return new " + main.ReaderClassName + " ();");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("protected override System.Xml.Serialization.XmlSerializationWriter CreateWriter () {");
			WriteLine ("return new " + main.WriterClassName + " ();");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("public override bool CanDeserialize (System.Xml.XmlReader xmlReader) {");
			WriteLine ("return true;");
			WriteLineUni ("}");
			
			WriteLineUni ("}");
			WriteLine ("");
			
			// Write a serializer for each imported map
			
			foreach (GenerationResult res in generatedMaps)
			{
				res.SerializerClassName = GetUniqueClassName (res.Mapping.ElementName + "Serializer");
				
				WriteLine (access_mod + " sealed class " + res.SerializerClassName + " : " + baseSerializerName);
				WriteLineInd ("{");
				WriteLineInd ("protected override void Serialize (object obj, System.Xml.Serialization.XmlSerializationWriter writer) {");
				WriteLine ("((" + res.WriterClassName + ")writer)." + res.WriteMethodName + "(obj);");
				WriteLineUni ("}");
				WriteLine ("");
				
				WriteLineInd ("protected override object Deserialize (System.Xml.Serialization.XmlSerializationReader reader) {");
				WriteLine ("return ((" + res.ReaderClassName + ")reader)." + res.ReadMethodName + "();");
				WriteLineUni ("}");
				
				WriteLineUni ("}");
				WriteLine ("");
			}

			WriteLine ("#if !TARGET_JVM"); // does it make sense? ;-)
			WriteLine (access_mod + " class " + main.ImplementationClassName + " : System.Xml.Serialization.XmlSerializerImplementation");
			WriteLineInd ("{");
			
			WriteLine ("System.Collections.Hashtable readMethods = null;");
			WriteLine ("System.Collections.Hashtable writeMethods = null;");
			WriteLine ("System.Collections.Hashtable typedSerializers = null;");
			WriteLine ("");
		
			WriteLineInd ("public override System.Xml.Serialization.XmlSerializationReader Reader {");
			WriteLineInd ("get {");
			WriteLine ("return new " + main.ReaderClassName + "();");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("public override System.Xml.Serialization.XmlSerializationWriter Writer {");
			WriteLineInd ("get {");
			WriteLine ("return new " + main.WriterClassName + "();");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("public override System.Collections.Hashtable ReadMethods {");
			WriteLineInd ("get {");
			WriteLineInd ("lock (this) {");
			WriteLineInd ("if (readMethods == null) {");
			WriteLine ("readMethods = new System.Collections.Hashtable ();");
			foreach (GenerationResult res in generatedMaps)
				WriteLine ("readMethods.Add (@\"" + res.Mapping.GetKey () + "\", @\"" + res.ReadMethodName + "\");");
			WriteLineUni ("}");
			WriteLine ("return readMethods;");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("public override System.Collections.Hashtable WriteMethods {");
			WriteLineInd ("get {");
			WriteLineInd ("lock (this) {");
			WriteLineInd ("if (writeMethods == null) {");
			WriteLine ("writeMethods = new System.Collections.Hashtable ();");
			foreach (GenerationResult res in generatedMaps)
				WriteLine ("writeMethods.Add (@\"" + res.Mapping.GetKey () + "\", @\"" + res.WriteMethodName + "\");");
			WriteLineUni ("}");
			WriteLine ("return writeMethods;");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("public override System.Collections.Hashtable TypedSerializers {");
			WriteLineInd ("get {");
			WriteLineInd ("lock (this) {");
			WriteLineInd ("if (typedSerializers == null) {");
			WriteLine ("typedSerializers = new System.Collections.Hashtable ();");
			foreach (GenerationResult res in generatedMaps)
				WriteLine ("typedSerializers.Add (@\"" + res.Mapping.GetKey () + "\", new " + res.SerializerClassName + "());");
			WriteLineUni ("}");
			WriteLine ("return typedSerializers;");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLineUni ("}");
			WriteLine ("");

			WriteLine ("public override XmlSerializer GetSerializer (Type type)");
			WriteLineInd ("{");
			WriteLine ("switch (type.FullName) {");
			foreach (GenerationResult res in generatedMaps) {
				if (res.Mapping is XmlTypeMapping) {
					WriteLineInd ("case \"" + ((XmlTypeMapping) res.Mapping).TypeData.CSharpFullName + "\":");
					WriteLine ("return (XmlSerializer) TypedSerializers [\"" + res.Mapping.GetKey () + "\"];");
					WriteLineUni ("");
				}
			}
			WriteLine ("}");
			WriteLine ("return base.GetSerializer (type);");
			WriteLineUni ("}");
			WriteLine ("");
			
			WriteLineInd ("public override bool CanSerialize (System.Type type) {");
			foreach (GenerationResult res in generatedMaps) {
				if (res.Mapping is XmlTypeMapping)
					WriteLine ("if (type == typeof(" + (res.Mapping as XmlTypeMapping).TypeData.CSharpFullName +  ")) return true;");
			}
			WriteLine ("return false;");
			WriteLineUni ("}");
			
			WriteLineUni ("}");
			WriteLine ("");
			WriteLine ("#endif");
		}
#endif
SerializationCodeGenerator