IComparable не включается при сериализации в WCF
У меня есть список, который я заполняю на стороне сервера. Это список "Пользователей", который реализует IComparable. Теперь, когда WCF сериализует данные, я предполагаю, что это не включает метод CompareTo. Это мой класс Object:
[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 ответа
Вам не нужно реализовывать сопоставимые.
Вы также можете использовать делегаты для сортировки списка, без возможности сопоставления в классе. Попробуйте следующий код.
users.Sort(delegate(User u1, User u2) { return u1.LastActive.CompareTo(u2.LastActive); });
Вы можете использовать это непосредственно в вашем клиенте.
Интерфейсы (код) не сериализуются. Вы можете рассмотреть возможность перехода на NetDataContractSerializer
, В этом случае информация о типе будет включена в поток, и вы можете получить тот же объект на клиенте (если сборка, содержащая тип, находится в AppDomain
).
Нет, метод CompareTo не является членом.
Если вы хотите повторить это на стороне клиента, либо предоставьте библиотеку на стороне клиента, которая адаптирует объект клиента, а также реализует IComparable.
У @frogbot есть действительное предложение, но передача объектов противоречит истинной природе SOA, цель - обговорить интерфейсы, и именно поэтому они затруднили использование NetDataContractSerializer.
Поскольку ваш клиент и сервер используют один и тот же технологический стек (т. Е. Оба используют.Net), ваш код на стороне клиента должен ссылаться на ту же сборку (содержащую объект данных), что и сервер *. Тогда ваши реализации интерфейса будут не повреждены, обе сборки будут использовать одни и те же определения объектов данных, а не сервер, использующий обычное определение, и клиент, использующий определение, которое создается как часть прокси.
Совместное использование или "повторное использование" этих сборок - тема, которая была хорошо освещена в SO.
* это означает, что ваши объекты данных, такие как Пользователь, содержатся в отдельной сборке, что является единственной задачей этой сборки. Тогда и ваш клиент, и ваш сервер (веб-сервис) могут ссылаться на него.