IComparable не включается при сериализации в WCF

У меня есть список, который я заполняю на стороне сервера. Это список «Пользователь», который реализует IComparable. Теперь, когда WCF сериализует данные, я думаю, он не включает метод CompareTo. Это мой класс объекта:

[DataContract]
public class User : IComparable
{
    private string e164, cn, h323;
    private int id;
    private DateTime lastActive;

    [DataMember]
    public DateTime LastActive
    {
        get { return lastActive; }
        set { laatstActief = value; }
    }
    [DataMember]
    public int Id
    {
        get { return id; }
        set { id = value; }
    }
    [DataMember]
    public string H323
    {
        get { return h323; }
        set { h323 = value; }
    }
    [DataMember]
    public string Cn
    {
        get { return cn; }
        set { cn = value; }
    }
    [DataMember]
    public string E164
    {
        get { return e164; }
        set { e164 = value; }
    }

    public User()
    {

    }

    public User(string e164, string cn, string h323, DateTime lastActive)
    {
        this.E164 = e164;
        this.Cn = cn;
        this.H323 = h323;
        this.LastActive= lastActive;
    }
    [DataMember]
    public string ToStringExtra
    {
        get
        {
            if (h323 != "/" && h323 != "")
                return h323 + " (" + e164 + ")";
            return e164;
        }
        set { ;}
    }

    public override string ToString()
    {
        if (Cn.Equals("Trunk Line") || Cn.Equals(""))
            if (h323.Equals(""))
                return E164;
            else
                return h323;
        return Cn;
    }

    public int CompareTo(object obj)
    {
        User user = (User)obj;
        return user.LastActive.CompareTo(this.LastActive);
    }
}

Можно ли заставить метод CompareTo связаться с клиентом? Помещение [DataMember] не является решением, как я пробовал (я знаю...).

Заранее спасибо.


person Terry    schedule 07.05.2010    source источник


Ответы (4)


Вам не нужно реализовывать сопоставимые.

Вы также можете использовать делегаты для сортировки списка без icomparable в классе. Попробуйте следующий код.

users.Sort(delegate(User u1, User u2) { return u1.LastActive.CompareTo(u2.LastActive); });

Вы можете использовать это прямо в своем клиенте.

person user340360    schedule 13.05.2010

Нет, CompareTo — это метод, а не член.

Если вы хотите воспроизвести это на стороне клиента, либо предоставьте библиотеку на стороне клиента, которая адаптирует объект клиента, а также реализует IComparable.

У @frogbot действительно есть правильное предложение, но передача объектов противоречит истинной природе SOA, цель состоит в том, чтобы говорить об интерфейсах, и поэтому они усложнили использование NetDataContractSerializer.

person Nix    schedule 07.05.2010

Интерфейсы (код) не сериализуются. Вы можете подумать о переходе на NetDataContractSerializer. В этом случае информация о типе будет включена в поток, и вы сможете получить тот же объект на клиенте (если сборка, содержащая тип, находится в AppDomain).

person UserControl    schedule 07.05.2010

Поскольку ваш клиент и сервер используют один и тот же технологический стек (т. е. оба используют .Net), код на стороне клиента должен ссылаться на ту же сборку (содержащую объект данных), что и сервер*. Тогда ваши реализации интерфейса будут неповрежденными, обе сборки будут использовать одни и те же определения объектов данных, а не сервер, использующий обычное определение, и клиент, использующий определение, сгенерированное как часть прокси.

Совместное использование или «повторное использование» этих сборок — тема, которая хорошо освещена в SO.

* это означает, что ваши объекты данных, такие как User, содержатся в отдельной сборке, что является единственной задачей этой сборки. Тогда и ваш клиент, и ваш сервер (веб-сервис) могут ссылаться на него.

person slugster    schedule 07.05.2010