protected virtual object ReadMessage (XmlMembersMapping typeMap)
{
object[] parameters = new object[typeMap.Count];
if (typeMap.HasWrapperElement)
{
// bug #79988: out parameters need to be initialized if they
// are value types
ArrayList members = ((ClassMap) typeMap.ObjectMap).AllMembers;
for (int n = 0; n < members.Count; n++) {
XmlTypeMapMember mem = (XmlTypeMapMember) members [n];
if (!mem.IsReturnValue && mem.TypeData.IsValueType)
SetMemberValueFromAttr (mem, parameters, CreateInstance (
mem.TypeData.Type), true);
}
if (_format == SerializationFormat.Encoded)
{
while (Reader.NodeType == System.Xml.XmlNodeType.Element)
{
string root = Reader.GetAttribute ("root", XmlSerializer.EncodingNamespace);
if (root == null || System.Xml.XmlConvert.ToBoolean(root)) break;
ReadReferencedElement ();
Reader.MoveToContent ();
}
}
while (Reader.NodeType != System.Xml.XmlNodeType.EndElement &&
// it could be an empty root element
Reader.ReadState == ReadState.Interactive)
{
if (Reader.IsStartElement(typeMap.ElementName, typeMap.Namespace)
|| _format == SerializationFormat.Encoded)
{
ReadAttributeMembers ((ClassMap)typeMap.ObjectMap, parameters, true);
if (Reader.IsEmptyElement) {
Reader.Skip();
Reader.MoveToContent();
continue;
}
Reader.ReadStartElement();
ReadMembers ((ClassMap)typeMap.ObjectMap, parameters, true, false);
ReadEndElement();
break;
}
else
UnknownNode(null);
Reader.MoveToContent();
}
}
else
ReadMembers ((ClassMap)typeMap.ObjectMap, parameters, true, _format == SerializationFormat.Encoded);
if (_format == SerializationFormat.Encoded)
ReadReferencedElements();
return parameters;
}