59

次のWCFDataContractがあります。

[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でマークすることを検討してください。

List私のメソッドの1つは、タイプのを返すことですOccupant。これが原因でしょうか?

4

6 に答える 6

114

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

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

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

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

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

于 2012-04-09T17:35:39.540 に答える
9

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

于 2012-04-09T17:36:18.490 に答える
5

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

/// <summary>
/// parameterless default constructor only for serialization
/// </summary>
public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); }
于 2016-10-14T21:52:32.650 に答える
2

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

于 2012-04-09T17:45:51.020 に答える
1

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

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

これは私を助けます。

于 2018-10-09T12:40:44.610 に答える
0

私の推測では、_Emailが初期化されていないためです。次のように設定EmitDefaultValueしてfalse、それが役立つかどうかを確認できます。

[DataMember(EmitDefaultValue = false)]
public string Email
{
于 2012-04-09T17:36:23.963 に答える