数据合同exception。 无法序列化

我有以下的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; } } } 

当我尝试通过networking浏览器(它托pipe在IIS上)访问此服务时,出现此错误:

System.Runtime.Serialization.InvalidDataContractException:types'MyNamespace.Occupant'不能序列化。 考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。 如果types是一个集合,可以考虑使用CollectionDataContractAttribute来标记它。

我的一个方法是返回一个types的Occupant List 。 这会造成吗?

由于您提供了一个或多个初始化构造函数,因此还需要添加无参数(默认)构造函数。

即你需要添加:

 [DataContract] public class Occupant { // *** Needed only for Serialization public Occupant() {} ... 

这是因为默认构造函数在添加显式构造函数时消失 。

[问题不在于返回List<Occupant>方法,因为方法没有被序列化)。]

尝试添加一个空的构造函数。 通常这会引发序列化器。

你需要一个默认的无参数构造函数。 我从来没有打算实际使用我的,所以我添加了IntelliSense的摘要,并抛出一个运行时exception,以防止它被使用。

 /// <summary> /// parameterless default constructor only for serialization /// </summary> public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); } 

你应该添加一个空的参数构造函数到你的datacontract类

我的猜测是因为_Email没有初始化。 你可以设置EmitDefaultValuefalse ,看看是否有帮助:

 [DataMember(EmitDefaultValue = false)] public string Email {