it-swarm.com.de

Datenübertragungsausnahme. Kann nicht serialisiert werden

Ich habe den folgenden 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; }
    }
}

Wenn ich versuche, auf diesen Dienst über einen Webbrowser zuzugreifen (er wird auf IIS gehostet), erhalte ich folgende Fehlermeldung:

System.Runtime.Serialization.InvalidDataContractException: Typ 'MyNamespace.Occupant' kann nicht serialisiert werden. Markieren Sie es mit dem DataContractAttribute-Attribut und markieren Sie alle seine Mitglieder, die mit dem DataMemberAttribute-Attribut serialisiert werden sollen. Wenn es sich bei dem Typ um eine Sammlung handelt, sollten Sie sie mit dem CollectionDataContractAttribute kennzeichnen.

Eine meiner Methoden ist, eine List vom Typ Occupant zurückzugeben. Wäre das die Ursache?

48
Justin

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

sie müssen hinzufügen:

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

Dies liegt daran, dass der Standardkonstruktor verschwindet wenn Sie einen expliziten Konstruktor hinzufügen.

[Das Problem besteht nicht darin, dass die Methode List<Occupant> zurückgibt, da Methoden nicht serialisiert werden.]

98
StuartLC

Versuchen Sie, einen leeren Konstruktor hinzuzufügen. Oftmals löst dies den Serializer aus.

9
Rob Rodi

Sie benötigen einen parameterlosen Standardkonstruktor. Ich habe nie vor, meine zu verwenden, also habe ich eine Zusammenfassung für IntelliSense hinzugefügt und eine Laufzeitausnahme ausgelöst, um zu verhindern, dass sie verwendet wird.

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

Sie sollten Ihrer Datenkontaktklasse einen leeren Parameter-Konstruktor hinzufügen

2
rada

Meine Vermutung wäre, dass _Email nicht initialisiert wird. Sie könnten EmitDefaultValue auf false setzen und sehen, ob das hilft:

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

Wenn Sie standardmäßig KEIN Setter haben, führen Sie folgende Schritte aus:

  1. Parameterlosen Konstruktor hinzufügen;
  2. Und mindestens private set hinzufügen.

Das hilft mir.

0
Anton Semenov