web-dev-qa-db-ja.com

WCFにはDataContract属性が必要ですか

私はWCFサービスと彼のクライアントを書いています。サービスとクライアントの間で、カスタムクラスのオブジェクトを送受信したい。

私は3つのモジュールを持っています

  • WCFサービス
  • WCFクライアント
  • 共通クラスライブラリ

WCFサービスとクライアントの両方に、共通のクラスライブラリへの参照があります。すべてのクラスをDataContract属性でマークしたくありません。

それで、私の質問「DataContract属性はWCFに必要ですか?」

.NET4とnetTcpBindingを使用しています。

30
user179437

正しく思い出せば(IIRC)、正式なデータコントラクトマーカーを使用しないと、デフォルトでフィールドシリアライザーのように動作します。これは機能しますが、プライベートな変更によってクライアント/サーバーが破損する可能性があるため、バージョン管理は簡単ではありません。 IMOは、常にWCFタイプをdata-contract/data-member属性で正式に装飾する必要があります。それらがなくても機能しますが、理由が間違っています(IIRC、元々はしませんでした正式なマーカーなしで機能します)。

23
Marc Gravell

「DataContract属性はWCFに必要ですか?」

技術的にはありません。これは、DataContractSerializerを使用するかどうかによって異なります(これは多くのバインディングのデフォルトです)。

他のオプションがあります:

  1. 代替のシリアライザーを検討する
  2. データコントラクトサロゲート (属性はまだ必要ですどこか)を使用してみてください。ただし、クラスをそのままにしておくことができる可能性があります。関連する)
  3. データコントラクト属性なしでクラスをシリアル化する場合は、 シリアル化のデフォルト に依存します
7
Schneider

WCFでは、いくつかのシリアル化手法を使用できます。これは、WCFに関する優れた適応性の1つです。見てください:

http://msdn.Microsoft.com/en-us/magazine/cc163569.aspx

3
Matthew Abbott

DataContract属性を使用する必要はありません。サービスは、DataContract属性がなくても問題なく機能します。

そうは言っても、あなたのサービスとクライアントにクラスライブラリを共有させることが最良の設計アプローチであるとは本当に思いません。 DataContractsを介してタイプを公開すると、はるかに明確になります。

いつか誰かがあなたのサービスを利用したいが、共有クラスライブラリにアクセスできない場合はどうなりますか?

3
Juan Gomez