数据合同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
没有初始化。 你可以设置EmitDefaultValue
为false
,看看是否有帮助:
[DataMember(EmitDefaultValue = false)] public string Email {