Подтвердить что ты не робот

Исключение Datacontract. Не может быть сериализован

У меня есть следующий 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; }
    }
}

Когда я пытаюсь получить доступ к этой службе через веб-браузер (она размещена на IIS), я получаю эту ошибку:

System.Runtime.Serialization.InvalidDataContractException: тип 'MyNamespace.Occupant' не может быть сериализован. Подумайте о том, чтобы маркировать его атрибутом DataContractAttribute и маркировать все его элементы, которые вы хотите сериализовать с атрибутом DataMemberAttribute. Если тип представляет собой коллекцию, рассмотрите ее маркировку с помощью CollectionDataContractAttribute.

Один из моих методов возвращает List типа Occupant. Это будет причиной этого?

4b9b3361

Ответ 1

Поскольку вы предоставили один или несколько конструкторов инициализации, вам также потребуется добавить конструктор без параметров (по умолчанию).

то есть. Вам нужно добавить:

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

Это связано с тем, что конструктор по умолчанию исчезает при добавлении явного конструктора.

[Проблема не в том, что метод возвращает List<Occupant>, так как методы не сериализованы).]

Ответ 2

Попробуйте добавить пустой конструктор. Часто это заставляет сериализатор.

Ответ 3

Вам нужен конструктор без параметров без параметров. Я никогда не планирую использовать мои, поэтому я добавил сводку для IntelliSense и выброшу исключение во время выполнения, чтобы оно не использовалось.

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

Ответ 4

Вы должны добавить пустой конструктор параметров в класс datacontract

Ответ 5

Мое предположение было бы потому, что _Email не инициализируется. Вы можете установить EmitDefaultValue на false и посмотреть, помогает ли это:

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