简介WCF Data Contract之枚举

2008-06-25 17:17:17.0     浏览:795     来源:e800.net频道
关键词:  Contract     WCF   

1、枚举被定义成总是可以序列化的,所以你定义新的枚举类型时,不需要应用DataContract就可以在数据契约中自由使用,同时你可以通过应用NonSerializedAttributed来排除不希望被序列化的枚举成员,这种枚举我们称之为简单枚举,例如:

public enum CarCondition

{

New,

Used,

Rental,

[NonSerialized]

Lost

}

如果使用SVCUtil为客户端导出的对应的枚举定义中将会使用DataContract和EnumMember来替代,如下所示:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]

[System.Runtime.Serialization.DataContractAttribute(Name="CarCondition", Namespace="…")]

public enum CarCondition : int

{

[System.Runtime.Serialization.EnumMemberAttribute()]

New = 0,

[System.Runtime.Serialization.EnumMemberAttribute()]

Used = 1,

[System.Runtime.Serialization.EnumMemberAttribute()]

Rental = 2,

}

2、如果你需要定制枚举的数据契约名称、命名空间、枚举成员的名称的话,你就需要使用DataContract和EnumMember两个属性。使用EnumMemberAttribute的Value属性来定制枚举成员的名称。如果采用数据契约模型(应用DataContract)的枚举中,只有应用了EnumMember的枚举成员才会被序列化(也就是会包含在数据契约中)。

注意:如果我们在一个服务操作(应用了OperationContractAttribute属性)中增加了一个枚举类型的参数,而且这个枚举类型应用了DataContractAttribute属性,但对其中的枚举成员没有应用EnumMemberAttribute属性,在使用SVCUtil产生代理的时候将会出现让人范晕的代理代码:例如我们有如下操作定义以及枚举定义:

[OperationContract]

void TestSimpleEnum2(SimpleFlagEnum e);

[DataContract]

public enum SimpleFlagEnum

{

New = 2,

Used = 4,

Rental = 8,

Lost = 16

}

在使用SVCUtil产生代理时,你将能看到都变成了采用XML序列化格式了,而且枚举也变成了string了,当然如果你服务端的契约定义不同,也有可能变成MessageContract并且带有// CODEGEN: Generating message contract since element name e from namespace http://tempuri.org/ is not marked nillable消息提示在产生的文件中。

[System.ServiceModel.XmlSerializerFormatAttribute()]

void TestSimpleEnum2(string e);

针对这种情况,你可以通过去掉枚举的DataContract属性或者给枚举成员增加EnumMember属性来解决。只有你在需要只发布部分枚举成员的时候才需要使用DataContractAttribute和EnumMemberAttribute属性,否则就采用缺省的契约(不应用任何属性)来包含全部枚举成员,当然缺省的契约和对枚举类型应用DataContract属性以及对其所有成员应用EnumMember属性是等价的。

[第1页]   [第2页]   [下一页]