WCF Data Contract之枚举

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

LazyBee

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
1 枚举被定义成总是可以序列化的,所以你定义新的枚举类型时,不需要应用DataContract就可以在数据契约中自由使用,同时你可以通过应用NonSerializedAttributed来排除不希望被序列化的枚举成员,这种枚举我们称之为简单枚举,例如:ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

public enum CarCondition

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

{

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
New,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Used,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Rental,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[NonSerialized]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Lost

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

}

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
public enum CarCondition : int

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[System.Runtime.Serialization.EnumMemberAttribute()]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
New = 0,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[System.Runtime.Serialization.EnumMemberAttribute()]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Used = 1,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[System.Runtime.Serialization.EnumMemberAttribute()]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Rental = 2,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

[OperationContract]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

void TestSimpleEnum2(SimpleFlagEnum e);

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

[DataContract]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

public enum SimpleFlagEnum

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
{ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
New = 2,ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Used = 4,ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Rental = 8,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Lost = 16

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
}

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

[System.ServiceModel.XmlSerializerFormatAttribute()]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

void TestSimpleEnum2(string e);

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

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

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

3通常数据契约包括的是枚举成员名称,而不是其数值。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
但是,如果使用数据契约模型并且接收端为 WCF 客户端,则导出的架构会保留数值。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

4 是否应用SerializableAttribute对简单枚举来说将没有任何影响。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

5 对简单枚举的枚举成员应用EnumMemberAttribute属性时,该属性将不起作用。对使用数据契约模型的枚举应用NonSerializedAttribute属性也将不起作用。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
6 对枚举可能需要使用按位操作,所以我们可以给枚举使用标志属性FlagsAttribute.ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
在这种情况下,可以同时发送或接收包含零个或多个枚举值的列表。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

为此,请将 DataContractAttribute 属性应用于标志枚举,然后使用 EnumMemberAttribute 属性对所有为 2 的幂的成员进行标记。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
请注意,若要使用标志枚举,级数必须为不间断的 2 的幂的序列(例如,1248163264)。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

可以使用下面的步骤来发送标志的枚举值:

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

1.ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
尝试查找映射到数值的枚举成员(应用了 EnumMemberAttribute 属性)。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
如果可以找到,就发送仅包含该成员的列表。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

2.ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
尝试将此数值分解为和的形式,以便枚举成员(每个成员都应用了 EnumMemberAttribute 属性)可以映射到和的各部分。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
发送包含所有这些成员的列表。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
请注意,贪婪算法用于查找这样的和,因此即使它存在,也不能保证可以找到。ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
为避免出现这种问题,请确保枚举成员的数值为 2 的幂。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

3.ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
如果上面的两个步骤均无法实现并且数值为非零,则引发一个 SerializationExceptionƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
如果数值为零,则发送空列表。

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

例如:

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

[DataContract][Flags]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

public enum CarFeatures

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

{

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
None = 0,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[EnumMember]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
AirConditioner = 1,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[EnumMember]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
AutomaticTransmission = 2,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[EnumMember]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
PowerDoors = 4,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
AlloyWheels = 8,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
DeluxePackage = AirConditioner | AutomaticTransmission | PowerDoors | AlloyWheels,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[EnumMember]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
CDPlayer = 16,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[EnumMember]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
TapePlayer = 32,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
MusicPackage = CDPlayer | TapePlayer,

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
[EnumMember]

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
Everything = DeluxePackage | MusicPackage

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

}

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

下面的示例值将按照规则进行序列化:

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

CarFeatures cf1 = CarFeatures.AutomaticTransmission;

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

//序列化为 <cf1>AutomaticTransmission</cf1>

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

CarFeatures cf2 = (CarFeatures)5;

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

//序列化为<cf2>AirConditioner PowerDoors</cf2>因为 5=1+4

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

CarFeatures cf3 = CarFeatures.MusicPackage;

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

//序列化为<cf3>CDPlayer TapePlayer</cf3>因为MusicPackage没有应用EnumMember

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

CarFeatures cf4 = CarFeatures.Everything;

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

//序列化为<cf4>Everything</cf4>因为Everything应用了EnumMember属性

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

CarFeatures cf5 = CarFeatures.DeluxePackage;

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

//抛出SerializationException异常,因为DeluxePackageAlloyWheels都没有应用 //EnumMembers属性

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

CarFeatures cf6 = CarFeatures.None;

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

//序列化为空列表<cf6></cf6>因为没有一个EnumMember的值为0

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’

ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’
7 不管是简单枚举还是使用数据契约模型的枚举,都不需要增加KnowType,当然也不需要使用ServiceKnowType.ƒ['²7 ‘å<www.netcsharp.cn]i[¨HPwêC’