Datacontract例外.无法序列化

Jus*_*tin 52 .net c# 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Stu*_*tLC 104

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

即你需要添加:

[DataContract]
public class Occupant
{
    // *** Needed only for Serialization
    public Occupant() {}
    ...
Run Code Online (Sandbox Code Playgroud)

这是因为当您添加显式构造函数时,默认构造函数会消失.

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

  • @VCD私有无参数构造函数工作.刚试过.Net Framework 4.5 (5认同)
  • 我们需要一个公共的无参数构造函数吗?或者私有无参数构造函数也能正常工作? (2认同)

Rob*_*odi 9

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


Zac*_*son 5

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

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

  • 序列化使用反射来调用构造函数。因此,将其设为私有以防止被使用。 (5认同)