2012-04-09 6 views
44

をシリアライズすることができない私は、次のWCFのDataContractを持っている: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: Type 'MyNamespace.Occupant' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute.

私の方法の1つはOccupantListです。これが原因だろうか?

答えて

91

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

すなわち、あなたは追加する必要があります。

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

default constructor disappearsあなたは明示的なコンストラクタを追加するときにためです。

[メソッドがシリアル化されないので問題は、List<Occupant>を返す方法ではありません)。]

+1

DCSが実際にコンストラクタを必要としているかどうかは間違いありません。http://msdn.microsoft.com/en-us/magazine/cc163569.aspxおよびhttp://stackoverflow.com/を参照してください。質問/ 178645/how-does-wcf-deserialization-constructorを呼び出さずにオブジェクトをインスタンス化 – StuartLC

+0

パブリックなパラメータのないコンストラクタが必要ですか?またはプライベートなパラメータのないコンストラクタも正常に動作しますか? – VCD

+3

@VCDプライベートパラメータなしコンストラクタが動作します。ちょうど.NET Framework 4.5で試しました –

9

空のコンストラクタを追加してみてください。しばしばシリアライザを無効にするでしょう。

0

_Emailが初期化されていない可能性があります。あなたはfalseEmitDefaultValueを設定し、それが助けかどうかを確認できます。

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

あなたは、デフォルトのパラメータなしのコンストラクタを必要とするあなたのDataContractのクラス

4

に空のパラメータのコンストラクタを追加する必要があります。私は実際に鉱山を使うつもりはないので、IntelliSenseのサマリを追加し、実行時例外を投げて使用しないようにします。

/// <summary> 
/// parameterless default constructor only for serialization 
/// </summary> 
public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); } 
関連する問題