C# WCF基本类型与复杂类型

C# WCF基本类型与复杂类型,c#,wcf,web-services,system-design,C#,Wcf,Web Services,System Design,我正在设计一个WCF服务,它将返回描述系统中某个人的对象列表 记录数量非常大,我有一些属性,比如人的性别。 创建一个名为Sex的新枚举(它是一个复杂类型,占用更多带宽)并带有两个值(男性和女性),还是使用一个原语类型(如bool IsMale)?不使用枚举的原因是XML模式没有一个与枚举等效的概念。也就是说,它没有命名值的概念。结果是枚举并不总是在平台之间转换 请改用bool或单字符字段。不使用枚举的原因是XML模式没有与枚举等效的概念。也就是说,它没有命名值的概念。结果是枚举并不总是在平台之间

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

记录数量非常大,我有一些属性,比如人的性别。
创建一个名为Sex的新枚举(它是一个复杂类型,占用更多带宽)并带有两个值(男性和女性),还是使用一个原语类型(如bool IsMale)?

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


请改用bool或单字符字段。

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


请使用布尔值或单个字符字段。

我建议您以最自然的方式对其进行建模,直到遇到特定问题或需要更改为止。

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

等等。当然,你可以公开多个。我建议你以任何看起来最自然的方式建模,直到你遇到一个特定问题或遇到一个变更要求。

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

等等。当然,您可以公开多个。

切换到bool的点很少;哪个更大:

<gender>male</gender> (or an attribute gender="male")
male(或属性gender=“male”)

true(或属性isMale=“true”)
不多,-p

记录数量真的很大

如果带宽成为一个问题,并且您可以控制服务的两端,那么您可以考虑其他一些选项,而不是更改您的实体:

  • 将数据预压缩为(例如)gzip,并传递(代替)一个
    字节[]
    ,注意在服务上启用MTOM
  • (或)开关序列化器;proobuf net具有WCF挂钩,可以比默认的DataContractSerialier实现显著的带宽改进(再次:启用MTOM)。在基于Northwind数据的测试中,它将736574字节减少到133010字节。并减少了处理它所需的CPU(win:win)。对于info,它将枚举减少为整数,通常只需要1字节的枚举值和1字节的字段标识;与UTF8下的
    Male
    相反,UTF8下的编码为21字节(对于大多数其他编码来说更多),或者
    gender=“Male”
    为14字节

但是,如果您有需要常规SOAP的外部呼叫者,则任何更改都会中断您的服务…

切换到bool的要点很少;哪个更大:

<gender>male</gender> (or an attribute gender="male")
male(或属性gender=“male”)

true(或属性isMale=“true”)
不多,-p

记录数量真的很大

如果带宽成为一个问题,并且您可以控制服务的两端,那么您可以考虑其他一些选项,而不是更改您的实体:

  • 将数据预压缩为(例如)gzip,并传递(代替)一个
    字节[]
    ,注意在服务上启用MTOM
  • (或)开关序列化器;proobuf net具有WCF挂钩,可以比默认的DataContractSerialier实现显著的带宽改进(再次:启用MTOM)。在基于Northwind数据的测试中,它将736574字节减少到133010字节。并减少了处理它所需的CPU(win:win)。对于info,它将枚举减少为整数,通常只需要1字节的枚举值和1字节的字段标识;与UTF8下的
    Male
    相反,UTF8下的编码为21字节(对于大多数其他编码来说更多),或者
    gender=“Male”
    为14字节
但是,如果您有需要常规SOAP的外部呼叫者,则任何更改都将中断您的服务