コード例 #1
0
        // 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)));
        }
コード例 #2
0
 // 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);
     }
 }
コード例 #3
0
        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);
        }