1

システム内の人を説明するオブジェクトのリストを返す WCF サービスを設計しています。

レコード数は非常に多く、人の性別などのプロパティがあります。2 つの値 (Male と Female) を持つ Sex という名前の新しい列挙型 (複雑な型であり、より多くの帯域幅を消費する) を作成するか、bool IsMale のようなプリミティブ型を使用する方がよいでしょうか?

4

3 に答える 3

2

boolに切り替えるポイントはほとんどありません。どちらが大きいか:

<gender>male</gender> (or an attribute gender="male")

また

<isMale>true</isMale> (or an attribute isMale="true")

あまりありません;-p

レコード数は本当に多いです...

帯域幅が問題になり、サービスの両端を制御する場合は、エンティティを変更するのではなく、他のいくつかのオプションを検討できます。

  • データを(たとえば)gzipとして事前圧縮し、(代わりに)byte[]またはを渡しStreamます。サービスでMTOMを有効にすることに注意してください。
  • (または)スイッチシリアライザー; proobuf-netにはWCFフックがあり、デフォルトよりも大幅な帯域幅の改善を実現できますDataContractSerialier(ここでもMTOMを有効にします)。Northwindデータ(ここ)に基づくテストでは、736,574バイトが133,010に減少しました。そしてそれを処理するために必要なCPUを減らしました(win:win)。詳細については、列挙型を整数に減らします。通常、列挙型の値には1バイト、フィールドの識別には1バイトしか必要ありません。とは対照的に<gender>Male</gender>、UTF8では21バイト(他のほとんどのエンコーディングではさらに多く)、つまりgender="male"14バイトです。

ただし、通常のSOAPを期待している外部の発信者がいる場合は、どちらの変更でもサービスが中断されます...

于 2009-10-15T04:22:19.187 に答える
1

特定の問題が発生するか、変更の要件が発生するまで、最も自然に見える方法でモデル化することをお勧めします。

WCFは、基になる詳細を抽象化するように設計されています。帯域幅が問題になる場合は、bool、int、またはenumはすべておそらく4バイトになると思います。ビットマスクまたはシングルバイトを使用して最適化できます。

繰り返しになりますが、APIの使いやすさと保守性の方がおそらくより重要ですが、どちらを好みますか?

if( user[i].Sex == Sexes.Male )

if( user[i].IsMale == true; ) // Could also expose .IsFemale

if( user[i].Sex == 'M' )

もちろん、複数を公開することもできます。

于 2009-10-15T03:11:48.410 に答える
1

を使用しない理由enumは、XML スキーマには に相当する概念がないためenumです。つまり、名前付きの値の概念がありません。その結果、列挙型はプラットフォーム間で常に変換されるとは限りません。

代わりにブール値または単一文字フィールドを使用してください。

于 2009-10-15T02:51:21.827 に答える