contracts.Add (ret);
ret.Initialize ();
+ if (type.BaseType != typeof (object)) {
+ TryRegister (type.BaseType);
+ if (!FindUserMap (type.BaseType).IsContractAllowedType)
+ throw new InvalidDataContractException (String.Format ("To be serializable by data contract, type '{0}' cannot inherit from non-contract and non-Serializable type '{1}'", type, type.BaseType));
+ }
+
object [] attrs = type.GetCustomAttributes (typeof (KnownTypeAttribute), true);
for (int i = 0; i < attrs.Length; i++) {
KnownTypeAttribute kt = (KnownTypeAttribute) attrs [i];
public QName XmlName { get; set; }
+ public abstract bool IsContractAllowedType { get; }
+
protected void HandleId (XmlReader reader, XmlFormatterDeserializer deserializer, object instance)
{
HandleId (reader.GetAttribute ("Id", KnownTypeCollection.MSSimpleNamespace), deserializer, instance);
internal partial class XmlSerializableMap : SerializationMap
{
+ public override bool IsContractAllowedType { get { return true; } }
+
public XmlSerializableMap (Type type, QName qname, KnownTypeCollection knownTypes)
: base (type, qname, knownTypes)
{
{
}
+ public override bool IsContractAllowedType { get { return true; } }
+
internal void Initialize ()
{
Type type = RuntimeType;
{
}
+ public override bool IsContractAllowedType { get { return false; } }
+
internal void Initialize ()
{
Members.AddRange (GetDefaultMembers ());
internal override string CurrentNamespace {
get { return XmlName.Namespace; }
}
+
+ public override bool IsContractAllowedType { get { return true; } }
}
internal interface ICollectionTypeMap
return null;
}
+ public override bool IsContractAllowedType { get { return false; } }
+
public override bool OutputXsiType {
get { return false; }
}
get { return a != null && !String.IsNullOrEmpty (a.Namespace) ? a.Namespace : KnownTypeCollection.MSArraysNamespace; }
}
+ public override bool IsContractAllowedType { get { return a != null; } }
+
public Type KeyType { get { return key_type; } }
public Type ValueType { get { return value_type; } }
{
}
+ public override bool IsContractAllowedType { get { return true; } }
+
public void Initialize ()
{
Members = GetMembers (RuntimeType, XmlName, false);
}
}
+ public override bool IsContractAllowedType { get { return false; } }
+
private EnumMemberAttribute GetEnumMemberAttribute (
MemberInfo mi)
{
var ds = (DataSet) x.ReadObject (r);
}
+
+ [Test]
+ [ExpectedException (typeof (InvalidDataContractException))] // BaseConstraintType1 is neither DataContract nor Serializable.
+ public void BaseConstraint1 ()
+ {
+ new DataContractSerializer (typeof (BaseConstraintType3)).WriteObject (XmlWriter.Create (TextWriter.Null), new BaseConstraintType3 ());
+ }
+
+ [Test]
+ public void BaseConstraint2 ()
+ {
+ new DataContractSerializer (typeof (BaseConstraintType4)).WriteObject (XmlWriter.Create (TextWriter.Null), new BaseConstraintType4 ());
+ }
}
[DataContract]
[DataMember]
public string X = "x";
}
+
+ class BaseConstraintType1 // non-serializable
+ {
+ }
+
+ [Serializable]
+ class BaseConstraintType2
+ {
+ }
+
+ [DataContract]
+ class BaseConstraintType3 : BaseConstraintType1
+ {
+ }
+
+ [DataContract]
+ class BaseConstraintType4 : BaseConstraintType2
+ {
+ }
}
[DataContract]