Datacontract例外。无法序列化

时间:2012-04-09 17:28:13

标签: c# .net wcf

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

当我尝试通过网络浏览器(它托管在IIS上)访问此服务时,我收到此错误:

  

System.Runtime.Serialization.InvalidDataContractException:无法序列化类型“MyNamespace.Occupant”。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute标记它。

我的一种方法是返回List类型Occupant。这会导致它吗?

6 个答案:

答案 0 :(得分:101)

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

即。你需要添加:

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

这是因为当您添加显式构造函数时default constructor disappears

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

答案 1 :(得分:9)

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

答案 2 :(得分:5)

您需要一个默认的无参数构造函数。我没有计划实际使用我的,所以我添加了一个IntelliSense摘要并抛出运行时异常以防止它被使用。

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

答案 3 :(得分:2)

您应该在datacontract类

中添加一个空参数构造函数

答案 4 :(得分:0)

我的猜测是因为_Email未初始化。您可以将EmitDefaultValue设置为false,看看是否有帮助:

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

答案 5 :(得分:0)

默认情况下,没有设置程序时,请执行以下步骤:

  1. 添加无参数构造函数;
  2. 并至少添加私有集

这对我有帮助。

相关问题