2012-04-09 10 views
44

serialisiert ich habe folgendes WCF Datacontract:Datacontract-Ausnahme. Kann nicht

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

Wenn ich versuche, diesen Dienst für den Zugriff auf über Webbrowser (es gehostet wird unter IIS), erhalte ich diese Fehlermeldung:

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.

Eine meiner Methoden gibt eine List des Typs Occupant zurück. Würde es das verursachen?

Antwort

91

Da Sie einen oder mehrere Initialisierungskonstruktoren bereitgestellt haben, müssen Sie auch einen parameterlosen (Standard) -Konstruktor hinzufügen.

das heißt Sie müssen hinzufügen:

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

Dies, weil die default constructor disappears ist, wenn Sie einen expliziten Konstruktor hinzufügen.

[Das Problem ist, mit dem Verfahren nicht List<Occupant> Rückkehr, da Methoden nicht serialisiert werden).]

+1

Trotz der Fehler, seine strittig, ob DCS braucht eigentlich überhaupt Konstruktor - siehe http://msdn.microsoft.com/en-us/magazine/cc163569.aspx und http://stackoverflow.com/ Fragen/178645/how-does-wcf-Deserialisierung-instanziate-Objekte-ohne-Aufruf-ein-Konstruktor – StuartLC

+0

Brauchen wir einen öffentlichen parameterlosen Konstruktor? Oder private parameterlose Konstruktor wird auch funktionieren? – VCD

+3

@ VCD Private parameterlosen Konstruktor funktioniert. Ich habe gerade versucht .Net Framework 4.5 –

9

Versuchen einen leeren Konstruktor hinzufügen. Oftmals wird dadurch der Serializer ausgelöst.

0

Meine Schätzung wäre, weil _Email nicht initialisiert ist. Sie könnten EmitDefaultValue zu false gesetzt und sehen, ob das hilft:

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

Sie sollten einen leeren Parameter Konstruktor Ihrer Klasse hinzufügen Datacontract

4

Sie benötigen einen Standard parameterlosen Konstruktor. Ich habe nie vor, meinen zu verwenden, also habe ich eine Zusammenfassung für IntelliSense hinzugefügt und eine Laufzeitausnahme geworfen, damit sie nicht verwendet wird.

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