IComparable не включается при сериализации в WCF - PullRequest
2 голосов
/ 07 мая 2010

У меня есть список, который я заполняю на стороне сервера. Это список «Пользователей», который реализует 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] не является решением, как я пытался (я знаю ...).

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

Ответы [ 4 ]

4 голосов
/ 13 мая 2010

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

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

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

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

2 голосов
/ 07 мая 2010

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

2 голосов
/ 07 мая 2010

Нет, метод CompareTo не является членом.

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

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

1 голос
/ 07 мая 2010

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

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

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

...