Объект WCF в DataContract

[Редактировать]: я добавил перечисление TokenType, что вызвало всю проблему...

У меня проблема с использованием WCF, и, к сожалению, я не нашел никакой полезной помощи. Я создаю приложение на основе WCF. Когда сервер отвечает на запрос клиента, я хочу отправить обратно следующий класс:

[DataContract]
public enum TokenType
{
    User,
    Device
}

[DataContract]
public class AuthenticationResponse
{
    [DataMember]
    public LogonStatus Status { get; set; }

    [DataMember]
    public AccessToken Token { get; set; }
}

[DataContract]
public struct AccessToken
{
    [DataMember]
    public string TokenID
    {
        get;
        set;
    }

    [DataMember]
    public TokenType Type
    {
        get;
        set;
    }

    [DataMember]
    public string Uid
    {
        get;
        set;
    }

    [DataMember]
    public string Name
    {
        get;
        set;
    }

    [DataMember]
    public DateTime ExpirationTime
    {
        get;
        set;
    }

    [DataMember]
    public DateTime GenerationTime
    {
        get;
        set;
    }

    [DataMember]
    public bool IsExpired
    {
        get
        {
            return DateTime.Now > this.ExpirationTime;
        }
    }
}

Когда я отправляю AuthenticationResponse обратно клиенту, он всегда терпит неудачу. Мой вопрос: есть ли шанс использовать объекты класса / структуры в объекте DataContract, или мне нужно заменить объект AccessToken базовыми типами (например, строка) в объекте AuthenticationResponse?

Спасибо всем за помощь! С наилучшими пожеланиями

Gabor

2 ответа

Решение

Ааа... Извините за это. Я был действительно глупым... Я забыл вставить перечисление TokenType в свой первоначальный вопрос, что является частью класса AuthenticationResponse, и это было проблемой... Я забыл установить атрибуты [EnumMember]...

После того, как я добавил, все работало хорошо.

Извините за эту глупую и действительно начинающую проблему...

Спасибо всем, кто помогает!

Проблема ваша public bool IsExpired не имеет установщика и поэтому вызывает проблемы при сериализации объекта.

Обходной путь должен установить защищенный / частный установщик для вашего свойства с пустым телом (или заменить его методом)

[DataMember]
public bool IsExpired
{
    get
    {
        return DateTime.Now > this.ExpirationTime;
    }
    set
    {
        /* Dummy setter for serialization fix */
    }
}

Вы можете найти больше информации о Сериализации здесь: https://msdn.microsoft.com/en-us/library/182eeyhh.aspx

Более конкретно:

Предметы, которые можно сериализовать

Следующие элементы могут быть сериализованы с использованием класса XmLSerializer:

Public read/write properties and fields of public classes
Другие вопросы по тегам