if (!pi.CanRead || (!pi.CanWrite && !(map is ICollectionTypeMap)))
throw new InvalidDataContractException (String.Format (
"DataMember property '{0}' on type '{1}' must have both getter and setter.", pi, pi.DeclaringType));
- data_members.Add (CreateDataMemberInfo (dma, pi, pi.PropertyType, qname.Namespace));
+ data_members.Add (CreateDataMemberInfo (dma, pi, pi.PropertyType, KnownTypeCollection.GetStaticQName (pi.DeclaringType).Namespace));
}
foreach (FieldInfo fi in type.GetFields (flags)) {
GetDataMemberAttribute (fi);
if (dma == null)
continue;
- data_members.Add (CreateDataMemberInfo (dma, fi, fi.FieldType, qname.Namespace));
+ data_members.Add (CreateDataMemberInfo (dma, fi, fi.FieldType, KnownTypeCollection.GetStaticQName (fi.DeclaringType).Namespace));
}
return data_members;
continue;
if (mi.GetCustomAttributes (typeof (IgnoreDataMemberAttribute), false).Length != 0)
continue;
- l.Add (CreateDataMemberInfo (new DataMemberAttribute (), mi, mt, XmlName.Namespace));
+ string ns = KnownTypeCollection.GetStaticQName (mi.DeclaringType).Namespace;
+ l.Add (CreateDataMemberInfo (new DataMemberAttribute (), mi, mt, ns));
}
l.Sort (DataMemberInfo.DataMemberInfoComparer.Instance);
return l;
if (fi.IsInitOnly)
throw new InvalidDataContractException (String.Format ("DataMember field {0} must not be read-only.", fi));
DataMemberAttribute dma = new DataMemberAttribute ();
- data_members.Add (CreateDataMemberInfo (dma, fi, fi.FieldType, qname.Namespace));
+ data_members.Add (CreateDataMemberInfo (dma, fi, fi.FieldType, KnownTypeCollection.GetStaticQName (fi.DeclaringType).Namespace));
}
}
{
new DataContractSerializer (typeof (BaseConstraintType4)).WriteObject (XmlWriter.Create (TextWriter.Null), new BaseConstraintType4 ());
}
+
+ [Test] // bug #652331
+ public void MembersNamespacesInBaseType ()
+ {
+ string xml1 = @"<Currency>JPY</Currency><Description i:nil=""true"" />";
+ string xml2 = @"<Currency xmlns=""http://schemas.datacontract.org/2004/07/SLProto5"">JPY</Currency><Description i:nil=""true"" xmlns=""http://schemas.datacontract.org/2004/07/SLProto5"" />";
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5.CashAmount> (new SLProto5.CashAmount () { Currency = "JPY" }, xml1, "#1").Currency, "r#1");
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5_Different.CashAmount> (new SLProto5_Different.CashAmount () { Currency = "JPY" }, xml2, "#2").Currency, "r#2");
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5.CashAmountDC> (new SLProto5.CashAmountDC () { Currency = "JPY" }, xml1, "#3").Currency, "r#3");
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5_Different.CashAmountDC> (new SLProto5_Different.CashAmountDC () { Currency = "JPY" }, xml2, "#4").Currency, "r#4");
+ }
+
+ T MembersNamespacesInBaseType_Part<T> (T instance, string expectedPart, string assert)
+ {
+ var ds = new DataContractSerializer (typeof (T));
+ var sw = new StringWriter ();
+ using (var w = XmlWriter.Create (sw))
+ ds.WriteObject (w, instance);
+ Assert.IsTrue (sw.ToString ().IndexOf (expectedPart) > 0, assert);
+ return (T) ds.ReadObject (XmlReader.Create (new StringReader (sw.ToString ())));
+ }
}
[DataContract]
public Parent Parent;
}
+namespace SLProto5
+{
+ public class CashAmount : Amount
+ {
+ }
+
+ [DataContract]
+ public class CashAmountDC : AmountDC
+ {
+ }
+
+ public class Amount
+ {
+ public string Currency { get; set; }
+ public string Description { get; set; }
+ }
+
+ [DataContract]
+ public class AmountDC
+ {
+ [DataMember]
+ public string Currency { get; set; }
+ [DataMember]
+ public string Description { get; set; }
+ }
+}
+
+namespace SLProto5_Different
+{
+ public class CashAmount : SLProto5.Amount
+ {
+ }
+
+ [DataContract]
+ public class CashAmountDC : SLProto5.AmountDC
+ {
+ }
+}
+
#endregion