2009-07-25 11 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 WTFのですか?

+0

私は(純粋に読んMSDNドキュメントに基づいて)理解して何から、明示的でなければなりません属性。私は答えで何を言いたいのかを説明しようとします。 – shahkalpesh

答えて

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が使用されている場合、CompositeTypeは(公開されているように)シリアル化されます。

ケース3:ケース2と同じです。コンテナのタイプがシリアル化可能であるため、列挙型(シリアル化されていなくても)はシリアル化されます。

ケース4:列挙型は文字列としてシリアル化されます。 EnumMemberを適用してシリアル化された値を変更するときは、Valueプロパティを使用できます。

ケース5:あなたが列挙値の1のためのDataContract、データメンバーを適用している列挙&に明示されています。ケース2

ケース6と同じ。これにより、シリアライザは列挙の他のメンバーを無視するように指示します。あなたが使用している場合、これは純粋にドキュメントの読み取りの一目理解に基づいている

、重要ではないようにしてください:)

関連する問題