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