2010-12-15 17 views
3

sagen, ich habe so etwas wie:WCF Datacontract Deserialisierung Problem mit leeren Werten

[DataContract(Namespace="http://bla.bla")] 
public class MyClass { 
    [DataMember] public long ResponseCode { get; set; } 
    [DataMember] public long Fee { get; set; } 
} 

und Folgendes wird von einem Kanal kommt:

<ns0:MyResult> 
    <ns2:ResponseCode xmlns:ns2="http://bla.bla">101</ns2:ResponseCode> 
    <ns2:Fee xmlns:ns2="http://bla.bla"></ns2:Fee> 
</ns0:MyResult> 

Ich erhalte die Fehlermeldung:

----> System.Xml.XmlException: Der Wert '' kann nicht als Typ 'Int64' geparst werden. ----> System.FormatException: Die Eingabezeichenfolge hatte kein richtiges Format.

Ich verstehe nicht warum. Der Standardwert von IsRequired Parameter von DataContract ist false, also erwarte ich, dass es ohne Fehler deserialize und initialisiert den fehlenden Wert mit Standardwerten für den Typ (Null). Was vermisse ich?

+0

siehe hier: http://stackoverflow.com/questions/19656691/wcf-convert-empty-element-to-nullable-native-type/19681312#19681312 – Terry

Antwort

3

aus - http://msdn.microsoft.com/en-us/library/aa347792.aspx

Interaction with IsRequired

As discussed in Data Contract Versioning, the DataMemberAttribute attribute has an IsRequired property (the default is false). The property indicates whether a given data member must be present in the serialized data when it is being deserialized. If IsRequired is set to true, (which indicates that a value must be present) and EmitDefaultValue is set to false (indicating that the value must not be present if it is set to its default value), default values for this data member cannot be serialized because the results would be contradictory. If such a data member is set to its default value (usually null or zero) and a serialization is attempted, a SerializationException is thrown.

und nicht 'gegebenen Datenelement Wert'

so sollten Sie Ihre XML haben, ohne <ns2:Fee> Element, um es

funktioniert
<ns0:MyResult> 
    <ns2:ResponseCode xmlns:ns2="http://bla.bla">101</ns2:ResponseCode> 
</ns0:MyResult> 

jedoch, ich suche auch nach einer Lösung für Ihr Problem. Wie kann ich meine WCF diese Ausnahme fangen und seinen Standardwert automatisch für den Typ Int oder Daten festlegen.

Eine weitere Idee ist, wenn ich versuche, folgende - mit i: nil = "true" -

<MyParentElement xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<MyElement i:nil="true"></MyElement> 
</MyParentElement> 

es sollte in der Lage sein, benutzerdefinierten Standardwert einzustellen. Ich möchte nicht unbedingt, dass ein fehlendes Element vom Client den übergebenen Standardwert angibt. Ein fehlendes Element könnte auch bedeuten, dass der Client eine ältere Version des Datenvertrags verwendet.

Verwandte Themen