2009-07-25 80 views
0

根據我的理解,WCF的數據合同模型與asmx web服務的舊選擇退出方法相比是可選的。您必須明確包含使用DataContractAttributeDataMemberAttribute所需的所有字段和類型。然而我的經歷卻有所不同。不一致的DataContractAttribute行爲

看看下面的實施例,


///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跆拳道?

+0

從我瞭解的看一眼就瞭解,你有當您使用要明確屬性。我會盡力在答案中解釋我想說的。 – shahkalpesh 2009-07-25 04:46:50

回答

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

0

注:我還沒有工作過WCF &這完全是基於閱讀。情況2:如果CompositeType用作服務的屬性/字段/返回值,它將被序列化(因爲它是公開的)。

情況3:與情況2相同。因爲容器類型是可序列化的,所以枚舉(儘管未標記)將被序列化。

案例4:Enum將被序列化爲字符串。應用EnumMember更改序列化值時,可以使用Value屬性。

案例5:同案例2

案例6:您是在枚舉&是明確已申請DataContract,數據成員的枚舉值之一。從而告訴序列化程序忽略枚舉的另一個成員。

請(基於純粹的閱讀MSDN文檔)不會是至關重要的,因爲這純粹是基於文檔的閱讀:)