web-dev-qa-db-ja.com

データ契約の例外。シリアル化できません

次の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; }
    }
}

Webブラウザ(IISでホストされている)を介してこのサービスにアクセスしようとすると、次のエラーが表示されます。

System.Runtime.Serialization.InvalidDataContractException:タイプ 'MyNamespace.Occupant'をシリアル化できません。 DataContractAttribute属性でマークし、シリアル化するすべてのメンバーをDataMemberAttribute属性でマークすることを検討してください。タイプがコレクションの場合、CollectionDataContractAttributeでマークすることを検討してください。

私のメソッドの1つは、List型のOccupantを返すことです。これが原因ですか?

52
Justin

1つ以上の初期化コンストラクターを提供したため、パラメーターなし(デフォルト)コンストラクターも追加する必要があります。

つまり、次を追加する必要があります。

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

これは、明示的なコンストラクターを追加すると デフォルトのコンストラクターが消える であるためです。

[メソッドはシリアル化されていないため、問題はList<Occupant>を返すメソッドにはありません。]

104
StuartLC

空のコンストラクターを追加してみてください。多くの場合、それはシリアライザを起動します。

9
Rob Rodi

デフォルトのパラメータなしのコンストラクタが必要です。実際に使用する予定はないので、IntelliSenseの概要を追加し、使用されないようにするためにランタイム例外をスローします。

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

空のパラメーターコンストラクターをdatacontractクラスに追加する必要があります

2
rada

デフォルトでセッターがない場合は、次の手順を実行します。

  1. パラメーターレスコンストラクターを追加します。
  2. そして、少なくともprivate setを追加します。

これは私を助けます。

1
Anton Semenov

私の推測は_Emailは初期化されていません。 EmitDefaultValuefalseに設定し、それが役立つかどうかを確認できます。

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