我正在设计一个 WCF 服务,它将返回描述系统中一个人的对象列表。
记录数量真的很大,而且我有一些属性,比如人的性别。使用两个值(男性和女性)创建一个名为 Sex 的新枚举(它是一种复杂类型并消耗更多带宽),还是使用 bool IsMale 之类的原始类型更好?
我正在设计一个 WCF 服务,它将返回描述系统中一个人的对象列表。
记录数量真的很大,而且我有一些属性,比如人的性别。使用两个值(男性和女性)创建一个名为 Sex 的新枚举(它是一种复杂类型并消耗更多带宽),还是使用 bool IsMale 之类的原始类型更好?
很少点切换到布尔;哪个更大:
<gender>male</gender> (or an attribute gender="male")
或者
<isMale>true</isMale> (or an attribute isMale="true")
内容不多;-p
记录数真的很大...
如果带宽成为问题,并且您控制服务的两端,那么您可以查看其他一些选项,而不是更改您的实体:
byte[]
or Stream
,注意在服务上启用 MTOMDataContractSerialier
(再次:启用 MTOM)。在基于 Northwind 数据(此处)的测试中,它将 736,574 字节减少到 133,010。并减少了处理它所需的 CPU (win:win)。对于信息,它将枚举减少为整数,通常只需要 1 个字节的枚举值和 1 个字节来标识字段;相比之下<gender>Male</gender>
,在 UTF8 下是 21 个字节(对于大多数其他编码来说更多),或者gender="male"
是 14 个字节。但是,如果您有期望常规 SOAP 的外部调用者,任何更改都会中断您的服务......
不使用 an 的原因enum
是 XML Schema 没有与enum
. 也就是说,它没有命名值的概念。结果是枚举并不总是在平台之间转换。
请改用 bool 或单字符字段。
我建议您以最自然的方式对其进行建模,直到您遇到特定问题或遇到更改要求。
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' )
等等。当然你可以暴露多个。