質問

私の理解に基づいて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のですか?

役に立ちましたか?

解決

列挙型は常に定義することにより、シリアライズされています。新しい列挙型を定義する場合、その上のDataContract属性を適用する必要はありません、あなたはデータ契約から特定の列挙値を除外するcontract.Ifあなたは自由に、あなたが最初に列挙型を飾るために必要なデータでそれを使用することができますDataContract属性を持ちます。その後、明示的に列挙型のデータコントラクトに含めるすべての列挙値にEnumMemberAttributeを適用します。このような

[DataContract]
enum ContactType
{
   [EnumMember]
   Customer,

   [EnumMember]
   Vendor,

   //Will not be part of data contract
   Partner
}

このワイヤ表現になります

enum ContactType
{
   Customer,
   Vendor
}

クラスのために真実ではありません、最初のケースを説明しているものを、見プログラミングWCFサービス

他のヒント

注:私は、WCFで働いていないと、これは純粋に読書に基づいています。

事例2:のCompositeTypeは、サービスのプロパティ/フィールド/戻り値として使用されている場合(それが公開されているように)、それがシリアライズされます。

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

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

ケース5:ケース2と同じ

事例6:あなたが列挙型に明示されている&列挙値の1のためのDataContract、データメンバーを適用しています。これにより、列挙型の他のメンバーを無視するシリアライザを語っています。

これは純粋にドキュメントの読み取りの一目理解に基づいているとして、重要ではないようにしてください。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top