2009-07-25 6 views
0

basierend auf meinem Verständnis WCF Daten Vertragsmodell war Opt-in vs der alten Opt-Out-Ansatz von asmx Web-Services. Sie müssen alle erforderlichen Felder und Typen explizit angeben, indem Sie DataContractAttribute und DataMemberAttribute verwenden. Meine Erfahrung war jedoch anders.Inkonsistente DataContractAttribute Verhalten

auf die folgenden Beispiele einen Blick darauf werfen,


///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 
} 

Alles, was ich sagen kann, ist WCF WTF?

+0

Von dem, was ich verstehe (basierend auf MSDN-Dokumentation rein zu lesen), müssen Sie explizit sein, wenn Sie verwenden Attribute. Ich werde versuchen zu erklären, was ich in der Antwort sagen möchte. – shahkalpesh

Antwort

3

Aufzählungen sind per Definition immer serialisierbar. Wenn Sie eine neue Enumeration definieren, müssen Sie das DataContract-Attribut nicht darauf anwenden, und Sie können es in einem Datenvertrag frei verwenden. Wenn Sie bestimmte Enum-Werte vom Datenvertrag ausschließen möchten, müssen Sie zuerst die Enumeration dekorieren mit dem DataContract-Attribut. Wenden Sie anschließend das EnumMemberAttribute explizit auf alle Enum-Werte an, die Sie in den Enum-Datenvertrag aufnehmen möchten. Wie dies

[DataContract] 
enum ContactType 
{ 
    [EnumMember] 
    Customer, 

    [EnumMember] 
    Vendor, 

    //Will not be part of data contract 
    Partner 
} 

in dieser Draht Darstellung führen:

enum ContactType 
{ 
    Customer, 
    Vendor 
} 

, die nicht wahr für Klassen ist, was den ersten Fall ist, erklärt, siehe Programming WCF Services

0

Anmerkung: Ich habe nicht gearbeitet WCF & Dies ist rein auf das Lesen basiert.

Fall 2: Wenn CompositeType als Eigenschaft/Feld/Rückgabewert eines Dienstes verwendet wird, wird es serialisiert (wie es öffentlich ist).

Fall 3: Wie Fall 2. Da der Containertyp serialisierbar ist, wird die Enumeration (obwohl sie nicht markiert ist) serialisiert.

Fall 4: Enum wird als String serialisiert. Sie können die Value-Eigenschaft verwenden, wenn Sie EnumMember anwenden, um den serialisierten Wert zu ändern.

Fall 5: Wie Fall 2

Fall 6: Sie sind explizit auf Enum & angewendet haben Datacontract, Datamember für eine der ENUM-Werte. Dadurch wird dem Serializer mitgeteilt, das andere Mitglied der Enumeration zu ignorieren.

Bitte nicht kritisch sein, da dies lediglich auf einem schnellen Blick Verständnis von doc Lesung basiert :)

Verwandte Themen