2010-12-15 95 views
3

Dire que j'ai quelque chose comme:WCF DataContract problème de désérialisation avec des valeurs vides

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

et ce qui suit provient d'un canal:

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

Je reçois l'erreur:

----> System.Xml.XmlException: La valeur '' ne peut pas être analysée comme le type 'Int64'. ----> System.FormatException: la chaîne d'entrée n'était pas dans un format correct.

Je ne comprends pas pourquoi. La valeur par défaut du paramètre IsRequired de DataContract est false donc je m'attends à ce qu'il désérialise sans erreurs et initialise la valeur manquante avec des valeurs par défaut pour le type (zéro). Qu'est-ce que je rate?

+0

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

Répondre

3

de - 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.

et non 'données fournies valeur membre'

donc vous devriez avoir votre XML sans élément <ns2:Fee> pour le faire fonctionner

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

Cependant, je cherche également une solution à votre problème. Comment puis-je faire en sorte que mon WCF capture cette exception et définisse sa valeur par défaut automatiquement pour le type int ou les dates.

Une autre idée est si j'essayer de suivre - en utilisant i: nil = "true" -

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

il devrait être en mesure de définir la valeur par défaut personnalisée. Je ne veux pas nécessairement un élément manquant du client pour indiquer la valeur par défaut passée. Elément manquant peut également signifier que le client utilise une ancienne version du contrat de données.