数据协定异常.无法序列化

本文关键字:序列化 异常 数据 | 更新日期: 2023-09-27 18:30:36

>我有以下WCF数据协定:

[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; }
    }
}

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

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

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

数据协定异常.无法序列化

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

即您需要添加:

[DataContract]
public class Occupant
{
    // *** Needed only for Serialization
    public Occupant() {}
    ...
这是因为添加显式构造函数

时默认构造函数将消失。

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

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

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

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

你应该向数据合约类添加一个空参数构造函数

如果默认情况下没有 setter,请执行以下步骤:

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

这对我有帮助。

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

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