6

DataGrid.ItemsSourceプロパティをList<PersonDetails>オブジェクトにバインドしています。Silverlight 対応の WCF Serviceからデータを取得しています。したがって、PersonDetailsクラスは Web プロジェクトで実装されます。クラスがSilverlightプロジェクトにある場合、各DataGridのヘッダーテキストは必要に応じて変更されます。しかし、このクラスを Web サービスで使用することはできません。唯一の解決策は、両方のプロジェクトに同じクラスを追加することです。しかし、他に方法はありますか?

クラスは次のようになります。

[DataContract]
public class PersonGeneralDetails
{
    // Properties

    [DataMember]
    [DisplayAttribute(Name = "Sira")]
    public int RowNumber { get; set; }

    [DataMember]
    [DisplayAttribute(Name = "Seriyasi")]
    public string SerialNumber { get; set; }
}

Web プロジェクトで属性が生成されないようです。DataGrid イベントを使用してヘッダー テキストを変更できることを知っています。しかし、属性を使用して機能させたいと思っています。

4

1 に答える 1

3

問題は、WCFDataContractが言語やプラットフォーム間で使用できる相互運用可能なメカニズムであるということです。

DataContractSerializer(またはそのコードSystem.Runtime.Serialization.dll、具体的にはメソッド)によって生成されたシリアル化されたデータをInternalWriteObjectXyz()見ると、値が単純なXMLメッセージにシリアル化されているだけであることがわかります。.NET Frameworkに関連するものは何もないため、カスタム生成とコンパイラ生成の両方のすべての種類の属性が削除され、クライアントによって受信されることさえありません。

データのコピーを作成してサーバーからクライアントに送信すると、クライアントは同じ署名を持つ新しいクラスを作成します。注:元のクラスの新しいオブジェクトではなく、同じ署名を持つ新しいクラス。

もちろん、これにはいくつかの回避策があります。独自のシリアライザー(例については、 SOに関するこの投稿を参照)または独自のシリアライザーを作成できますISerializationSurrogate

アセンブリをクライアントにデプロイ/共有できる場合は、適切な回避策があります。アセンブリをデプロイするだけDataContractSerializerで、クライアント上に適切なオブジェクトを構築できます(サーバー上にあるものとまったく同じで、すべての属性があります)。覚えておいてください:

  • カスタム属性が実行時の値に由来する場合(たとえば、ローカリゼーションのため)、それらはサーバーではなくクライアントで解決されます(属性はクライアントで作成されるため、それらの値はXMLに含まれません)メッセージ)。
  • クライアントアプリケーションで、タイプを含むアセンブリへの参照を追加する必要があります。
  • サービス参照を追加するときは、それらを使用するようにVSに指示する必要があります(またはプロキシを作成します)。[サービス参照設定]ダイアログで、[参照されるアセンブリのタイプを再利用する]を選択します(共有するアセンブリのみに制限できます)。
于 2013-03-08T12:14:26.353 に答える