I have a class that I need to be able to serialize to a SQLServer session variable and be available over a WCF Service. I have declared it as follows
namespace MyNM
{
[Serializable]
[DataContract(Name = "Foo", Namespace = "http://www.mydomain.co.uk")]
public class Foo : IEntity, ISafeCopy<Foo>
{
[DataMember(Order = 0)]
public virtual Guid Id { get; set; }
[DataMember(Order = 1)]
public virtual string a { get; set; }
DataMember(Order = 2)]
public virtual Bar c { get; set; }
/* ISafeCopy implementation */
}
[Serializable]
[DataContract(Name = "Bar ", Namespace = "http://www.mydomain.co.uk")]
public class Bar : IEntity, ISafeCopy<Bar>
{
#region Implementation of IEntity
DataMember(Order = 0)]
public virtual Guid Id { get; set; }
[DataMember(Order = 1)]
public virtual Baz y { get; set; }
#endregion
/* ISafeCopy implementation*/
}
[Serializable]
[DataContract]
public enum Baz
{
[EnumMember(Value = "one")]
one,
[EnumMember(Value = "two")]
two,
[EnumMember(Value = "three")]
three
}
But when I try and call this service, I get the following error in the trace log.
"System.Runtime.Serialization.InvalidDataContractException:
Type
'BarProxybcb100e8617f40ceaa832fe4bb94533c'
cannot be ISerializable and have
DataContractAttribute attribute."
If I take out the Serializable attribute, the WCF service works, but when the object can't be serialized to session. If I remove the DataContract attribute from class Bar, the WCF service fails saying
Type
'BarProxy3bb05a31167f4ba492909ec941a54533'
with data contract name
'BarProxy3bb05a31167f4ba492909ec941a54533:http://schemas.datacontract.org/2004/07/'
is not expected. Add any types not
known statically to the list of known
types – for example, by using the
KnownTypeAttribute attribute or by
adding them to the list of known types
passed to DataContractSerializer
I've tried adding a KnownType attribute to the foo class
[KnownType(typeof(Bar))]
But I still get the same error.
Can anyone help me out with this?
Many thanks
Dave
Best Answer
This question on MSDN might help: DataContract versus Serializable.
The accepted answer from that thread: