Reputation: 6559
I have the following WCF DataContract:
[DataContract]
public class Occupant
{
private string _Name;
private string _Email;
private string _Organization;
private string _Badge;
public Occupant(string name, string badge, string organization)
{
Name = name;
Badge = badge;
Organization = organization;
}
public Occupant(string name, string badge)
{
Value = name;
Key = badge;
}
[DataMember]
public string Key
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string Value
{
get { return _Badge; }
set { _Badge = value; }
}
[DataMember]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string Email
{
get { return _Email; }
set { _Email = value; }
}
[DataMember]
public string Organization
{
get { return _Organization; }
set { _Organization = value; }
}
[DataMember]
public string Badge
{
get { return _Badge; }
set { _Badge = value; }
}
}
When I try to access this service via web browser (it is hosted on IIS), I am getting this error:
System.Runtime.Serialization.InvalidDataContractException: Type 'MyNamespace.Occupant' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute.
One of my methods is returning a List
of type Occupant
. Would this be causing it?
Upvotes: 60
Views: 59301
Reputation: 461
When you have NO setter by default, do these steps:
This helps me.
Upvotes: 2
Reputation: 57373
You need a default parameterless constructor. I don't ever plan to actually use mine, so I added a summary for IntelliSense and throw a run-time exception to keep it from being used.
/// <summary>
/// parameterless default constructor only for serialization
/// </summary>
public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); }
Upvotes: 5
Reputation: 107387
Because you have provided one or more initializing constructors, you will also need to add a parameterless (default) constructor.
i.e. You need to add:
[DataContract]
public class Occupant
{
// *** Needed only for Serialization
public Occupant() {}
...
This is because the default constructor disappears when you add an explicit constructor.
[The issue isn't with the method returning List<Occupant>
, since methods aren't serialized).]
Upvotes: 120
Reputation: 21
You should add an empty parameter constructor to your datacontract class
Upvotes: 2
Reputation: 50028
My guess would be because _Email
is not initialized. You could set EmitDefaultValue
to false
and see if that helps:
[DataMember(EmitDefaultValue = false)]
public string Email
{
Upvotes: 0
Reputation: 3494
Try adding an empty constructor. Often times that will set off the serializer.
Upvotes: 9