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