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

同等のものを実装する必要はありません。

デリゲートを使用して、クラスで比類のないものを使用せずにリストを並べ替えることもできます。次のコードを試してください。

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で十分に取り上げられているトピックです。

*これは、Userなどのデータオブジェクトが別のアセンブリに含まれていることを意味します。これは、そのアセンブリの唯一のタスクです。次に、クライアントとサーバー(Webサービス)の両方がそれを参照できます。

于 2010-05-07T13:18:02.023 に答える