0

根据我的理解,WCF 的数据合同模型是选择加入与 asmx Web 服务的旧选择退出方法。您必须明确包括所有需要使用的字段和类型DataContractAttributeDataMemberAttribute。然而,我的经历却有所不同。

看看下面的例子,


///CASE: 1
///Behaves as excpected BoolValue is included but String Value is emitted
[DataContract]
public class CompositeType
{
    [DataMember]
    public bool BoolValue { get; set; }

    public string StringValue { get; set; }
}

///CASE: 2
///All elements are included, as if everything was marked.
public class CompositeType
{
   public bool BoolValue { get; set; }

    public string StringValue { get; set; }
}

///CASE: 3
/// MyEnum Type is included even though the MyEnum is not marked.
[DataContract]
public class CompositeType
{
    [DataMember]
    public bool BoolValue { get; set; }

    [DataMember]
    public string StringValue { get; set; }

    [DataMember]
    public MyEnum EnumValue{ get; set; }
}

public enum MyEnum
{
    hello = 0,
    bye = 1
}

///CASE: 4
/// MyEnum Type is no longer included. EnumValue is serialized as a string
[DataContract]
public class CompositeType
{
    [DataMember]
    public bool BoolValue { get; set; }

    [DataMember]
    public string StringValue { get; set; }

    [DataMember]
    public MyEnum EnumValue{ get; set; }
}

[DataContract]
public enum MyEnum
{
    hello = 0,
    bye = 1
}

///CASE: 5
//Both hello and bye are serilized
public enum MyEnum
{
    [EnumMember]
    hello = 0,
    bye = 1
}

///CASE: 6
//only hello is serilized
[DataContract]    
public enum MyEnum
{
    [EnumMember]
    hello = 0,
    bye = 1
}

我只能说WCF WTF?

4

2 回答 2

3

根据定义,枚举始终是可序列化的。当你定义一个新的枚举时,不需要对它应用DataContract属性,你可以在数据合约中自由使用它。如果你想从数据合约中排除某些枚举值,你需要先装饰枚举具有 DataContract 属性。然后,将 EnumMemberAttribute 显式应用于要包含在枚举数据协定中的所有枚举值。像这样

[DataContract]
enum ContactType
{
   [EnumMember]
   Customer,

   [EnumMember]
   Vendor,

   //Will not be part of data contract
   Partner
}

将导致此线表示:

enum ContactType
{
   Customer,
   Vendor
}

对于类来说,这不是真的,第一种情况的解释是什么,请参阅Programming WCF Services

于 2009-07-25T04:47:27.163 回答
0

注意:我没有使用过 WCF,这纯粹是基于阅读。

情况 2:如果 CompositeType 用作服务的属性/字段/返回值,它将被序列化(因为它是公共的)。

案例 3:同案例 2。因为容器类型是可序列化的,所以枚举(虽然没有标记)会被序列化。

情况 4:枚举将被序列化为字符串。您可以在应用 EnumMember 时使用 Value 属性来更改序列化值。

案例5:同案例2

案例 6:您在 Enum 上是明确的,并且已将 DataContract、DataMember 应用于枚举值之一。从而告诉序列化程序忽略枚举的其他成员。

请不要批评,因为这纯粹是基于对文档阅读的快速了解:)

于 2009-07-25T04:52:35.170 回答