// For now it could be private. protected Exception MissingRequiredMember(DataMemberInfo dmi, XmlReader reader) { var li = reader as IXmlLineInfo; return(new ArgumentException(String.Format("Data contract member {0} for the type {1} is required, but missing in the input XML.{2}", new QName(dmi.XmlName, dmi.XmlNamespace), RuntimeType, li != null && li.HasLineInfo() ? String.Format(" {0}({1},{2})", reader.BaseURI, li.LineNumber, li.LinePosition) : null))); }
// For now it could be private. protected void SetValue(DataMemberInfo dmi, object obj, object value) { try { if (dmi.Member is PropertyInfo) { ((PropertyInfo)dmi.Member).SetValue(obj, value, null); } else { ((FieldInfo)dmi.Member).SetValue(obj, value); } } catch (Exception ex) { throw new InvalidOperationException(String.Format("Failed to set value of type {0} for property {1}", value != null ? value.GetType() : null, dmi.Member), ex); } }
object DeserializeContent(XmlReader reader, XmlFormatterDeserializer deserializer, string id, bool empty) { object instance = FormatterServices.GetUninitializedObject(RuntimeType); HandleId(id, deserializer, instance); if (OnDeserializing != null) { OnDeserializing.Invoke(instance, new object [] { new StreamingContext(StreamingContextStates.All) }); } int depth = reader.NodeType == XmlNodeType.None ? reader.Depth : reader.Depth - 1; bool [] filled = new bool [Members.Count]; bool [] nsmatched = new bool [Members.Count]; int memberInd = -1, ordered = -1; while (!empty && reader.NodeType == XmlNodeType.Element && reader.Depth > depth) { DataMemberInfo dmi = null; int i = 0; bool nsmatchedOne = false; for (; i < Members.Count; i++) // unordered { if (Members [i].Order >= 0) { break; } if (reader.LocalName == Members [i].XmlName) { memberInd = i; dmi = Members [i]; nsmatchedOne = (dmi.XmlRootNamespace == null || reader.NamespaceURI == dmi.XmlRootNamespace); if (nsmatchedOne) { break; } } } for (i = Math.Max(i, ordered); i < Members.Count; i++) // ordered { if (dmi != null) { break; } if (reader.LocalName == Members [i].XmlName) { ordered = i; memberInd = i; dmi = Members [i]; nsmatchedOne = (dmi.XmlRootNamespace == null || reader.NamespaceURI == dmi.XmlRootNamespace); if (nsmatchedOne) { break; } } } if (dmi == null) { reader.Skip(); reader.MoveToContent(); continue; } if (filled [memberInd] && nsmatched [memberInd]) { // The strictly-corresponding member (i.e. that matches namespace URI too, not only local name) already exists, so skip this element. reader.Skip(); reader.MoveToContent(); continue; } nsmatched [memberInd] = nsmatchedOne; SetValue(dmi, instance, deserializer.Deserialize(dmi.MemberType, reader)); filled [memberInd] = true; reader.MoveToContent(); } for (int i = 0; i < Members.Count; i++) { if (!filled [i] && Members [i].IsRequired) { throw MissingRequiredMember(Members [i], reader); } } if (OnDeserialized != null) { OnDeserialized.Invoke(instance, new object [] { new StreamingContext(StreamingContextStates.All) }); } return(instance); }