string GenerateReadMessage (XmlMembersMapping typeMap)
{
WriteLine ("object[] parameters = new object[" + typeMap.Count + "];");
WriteLine ("");
if (typeMap.HasWrapperElement)
{
if (_format == SerializationFormat.Encoded)
{
WriteLine ("while (Reader.NodeType == System.Xml.XmlNodeType.Element)");
WriteLineInd ("{");
WriteLine ("string root = Reader.GetAttribute (\"root\", " + GetLiteral(XmlSerializer.EncodingNamespace) + ");");
WriteLine ("if (root == null || System.Xml.XmlConvert.ToBoolean(root)) break;");
WriteLine ("ReadReferencedElement ();");
WriteLine ("Reader.MoveToContent ();");
WriteLineUni ("}");
WriteLine ("");
WriteLine ("if (Reader.NodeType != System.Xml.XmlNodeType.EndElement)");
WriteLineInd ("{");
WriteLineInd ("if (Reader.IsEmptyElement) {");
WriteLine ("Reader.Skip();");
WriteLine ("Reader.MoveToContent();");
WriteLineUni ("}");
WriteLineInd ("else {");
WriteLine ("Reader.ReadStartElement();");
GenerateReadMembers (typeMap, (ClassMap)typeMap.ObjectMap, "parameters", true, false);
WriteLine ("ReadEndElement();");
WriteLineUni ("}");
WriteLine ("");
WriteLine ("Reader.MoveToContent();");
WriteLineUni ("}");
}
else
{
// bug #79988: out parameters need to be initialized if
// they are value types
ClassMap classMap = (ClassMap) typeMap.ObjectMap;
ArrayList members = classMap.AllMembers;
for (int n = 0; n < members.Count; n++) {
XmlTypeMapMember mem = (XmlTypeMapMember) members [n];
if (!mem.IsReturnValue && mem.TypeData.IsValueType)
GenerateSetMemberValueFromAttr (mem, "parameters",
String.Format ("({0}) Activator.CreateInstance(typeof({0}), true)", mem.TypeData.FullTypeName), true);
}
WriteLine ("while (Reader.NodeType != System.Xml.XmlNodeType.EndElement && Reader.ReadState == ReadState.Interactive)");
WriteLineInd ("{");
WriteLine ("if (Reader.IsStartElement(" + GetLiteral(typeMap.ElementName) + ", " + GetLiteral(typeMap.Namespace) + "))");
WriteLineInd ("{");
bool dummy = false;
GenerateReadAttributeMembers (typeMap, (ClassMap)typeMap.ObjectMap, "parameters", true, ref dummy);
WriteLine ("if (Reader.IsEmptyElement)");
WriteLineInd ("{");
WriteLine ("Reader.Skip(); Reader.MoveToContent(); continue;");
WriteLineUni ("}");
WriteLine ("Reader.ReadStartElement();");
GenerateReadMembers (typeMap, (ClassMap)typeMap.ObjectMap, "parameters", true, false);
WriteLine ("ReadEndElement();");
WriteLine ("break;");
WriteLineUni ("}");
WriteLineInd ("else ");
WriteLine ("UnknownNode(null);");
Unindent ();
WriteLine ("");
WriteLine ("Reader.MoveToContent();");
WriteLineUni ("}");
}
}
else
GenerateReadMembers (typeMap, (ClassMap)typeMap.ObjectMap, "parameters", true, _format == SerializationFormat.Encoded);
if (_format == SerializationFormat.Encoded)
WriteLine ("ReadReferencedElements();");
return "parameters";
}