WCF原始类型与复杂类型

时间:2009-10-15 02:18:45

标签: c# wcf web-services system-design

我正在设计一个WCF服务,该服务将返回描述系统中某人的对象列表。

记录数量真的很大,我有一些属性,如人的性别。 是否更好的创建一个新的枚举(它是一个复杂类型,消耗更多的带宽)名为性别与两个值(男性和女性)或使用原始类型像bool IsMale?

3 个答案:

答案 0 :(得分:2)

很少有人转向布尔;哪个更大:

<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数据(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' )

等。当然你可以暴露多个。