代码之家  ›  专栏  ›  技术社区  ›  Karim Agha

WCF基本类型与复杂类型

  •  1
  • Karim Agha  · 技术社区  · 17 年前

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

    最好创建一个名为Sex的新枚举(它是一个复杂类型,消耗更多带宽),有两个值(Male和Female),还是使用一个原始类型,如bool IsMale?

    3 回复  |  直到 17 年前
        1
  •  2
  •   Marc Gravell    17 年前

    很少有点切换到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数据的测试中 (here) 它将736574字节减少到133010。 和 减少了处理它所需的CPU(win:win)。作为信息,它将枚举简化为整数,通常只需要1个字节作为枚举值,1个字节用于标识字段;与...对比 <gender>Male</gender> ,在UTF8下为21个字节(对于大多数其他编码来说更多),或 gender="male" 14字节。

    但是,如果您有期望常规SOAP的外部调用者,则任何一种更改都会中断您的服务。..

        2
  •  1
  •   John Saunders    17 年前

    不使用A的原因 enum XML模式没有与 枚举 也就是说,它没有命名值的概念。结果是枚举并不总是在平台之间转换。

    请使用bool或单字符字段。

        3
  •  1
  •   TJB    17 年前

    我建议你以任何看起来最自然的方式对其进行建模,直到你遇到一个特定的问题或遇到更改的要求。

    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' )
    

    推荐文章