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?
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