2

我有一个我要在服务器端填写的列表。它是一个“用户”列表,它实现了 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 回答 4

4

您不需要实现可比性。

您也可以使用委托对列表进行排序,而无需类中的 icomparable。试试下面的代码。

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

您可以直接在客户端中使用它。

于 2010-05-13T14:22:28.073 回答
2

不,CompareTo 是一种方法而不是成员。

如果您想在客户端复制它,请提供一个客户端库来适应客户端对象并实现 IComparable。

@frogbot 确实有一个有效的建议,但传递对象违背了 SOA 的真正本质,目标是讨论接口,这就是为什么他们使使用 NetDataContractSerializer 变得更加困难的原因。

于 2010-05-07T12:17:28.580 回答
2

接口(代码)未序列化。您可以考虑切换到NetDataContractSerializer. 在这种情况下,类型信息将包含在流中,您可以在客户端上获取相同的对象(如果包含该类型的程序集在 中AppDomain)。

于 2010-05-07T12:18:16.583 回答
1

因为您的客户端和服务器使用相同的技术堆栈(即都使用.Net),所以让您的客户端代码引用与服务器使用的相同的(包含数据对象的)程序集*。然后您的接口实现将是完整的,两个程序集将使用相同的数据对象定义,而不是使用常规定义的服务器和使用作为代理的一部分生成的定义的客户端。

共享或“重用”这些程序集是 SO 中已经很好地涵盖的主题。

*这意味着您的数据对象(如用户)包含在单独的程序集中,这是该程序集的唯一任务。然后你的客户端和你的服务器(webservice)都可以引用它。

于 2010-05-07T13:18:02.023 回答