【问题标题】:Datacontract exception. Cannot be serialized数据合同异常。无法序列化
【发布时间】:2012-04-22 01:22:05
【问题描述】:

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

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

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

我的一种方法是返回Occupant 类型的List。会不会是这个原因?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

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

    即您需要添加:

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

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 序列化使用反射调用构造函数。因此,将其设为私有以防止被使用。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果您默认没有设置器,请执行以下步骤:

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

        这对我有帮助。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-27
            • 1970-01-01
            • 1970-01-01
            • 2023-03-25
            • 2020-05-23
            • 1970-01-01
            相关资源
            最近更新 更多