システム内の人を説明するオブジェクトのリストを返す WCF サービスを設計しています。
レコード数は非常に多く、人の性別などのプロパティがあります。2 つの値 (Male と Female) を持つ Sex という名前の新しい列挙型 (複雑な型であり、より多くの帯域幅を消費する) を作成するか、bool IsMale のようなプリミティブ型を使用する方がよいでしょうか?
システム内の人を説明するオブジェクトのリストを返す WCF サービスを設計しています。
レコード数は非常に多く、人の性別などのプロパティがあります。2 つの値 (Male と Female) を持つ Sex という名前の新しい列挙型 (複雑な型であり、より多くの帯域幅を消費する) を作成するか、bool IsMale のようなプリミティブ型を使用する方がよいでしょうか?
boolに切り替えるポイントはほとんどありません。どちらが大きいか:
<gender>male</gender> (or an attribute gender="male")
また
<isMale>true</isMale> (or an attribute isMale="true")
あまりありません;-p
レコード数は本当に多いです...
帯域幅が問題になり、サービスの両端を制御する場合は、エンティティを変更するのではなく、他のいくつかのオプションを検討できます。
byte[]
またはを渡しStream
ます。サービスでMTOMを有効にすることに注意してください。DataContractSerialier
(ここでもMTOMを有効にします)。Northwindデータ(ここ)に基づくテストでは、736,574バイトが133,010に減少しました。そしてそれを処理するために必要なCPUを減らしました(win:win)。詳細については、列挙型を整数に減らします。通常、列挙型の値には1バイト、フィールドの識別には1バイトしか必要ありません。とは対照的に<gender>Male</gender>
、UTF8では21バイト(他のほとんどのエンコーディングではさらに多く)、つまりgender="male"
14バイトです。ただし、通常のSOAPを期待している外部の発信者がいる場合は、どちらの変更でもサービスが中断されます...
特定の問題が発生するか、変更の要件が発生するまで、最も自然に見える方法でモデル化することをお勧めします。
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' )
もちろん、複数を公開することもできます。
を使用しない理由enum
は、XML スキーマには に相当する概念がないためenum
です。つまり、名前付きの値の概念がありません。その結果、列挙型はプラットフォーム間で常に変換されるとは限りません。
代わりにブール値または単一文字フィールドを使用してください。