2015-09-14 1 views
1

J'ai du mal à sérialiser cette chose.Comment sérialiser DateTime nullable dans un DataContrat WCF?

namespace Such.Namespace.Wow 
{ 
    [DataContract(Namespace = "http://very.namespace.uh")] 
    public class DogeResponse 
    { 
     [DataMember] 
     public virtual int Foo { get; set; } 

     [DataMember] 
     public virtual DateTime? ExpiringDate { get; set; } 
    } 
} 

Dans WSDL généré:

<xs:complexType name="DogeResponse"> 
<xs:sequence> 
<xs:element minOccurs="0" name="Foo" type="xs:int"/> 
<xs:element minOccurs="0" name="ExpiringDate" nillable="true" type="xs:dateTime"/> 
</xs:sequence></xs:complexType> 

Mais l'exception d'exécution se produit et retourne comme défaut XML:

<SerializationException> 
<Message>ValueType 'System.DateTime' cannot be null.</Message> 

Oui, je vis une question "similaire", mais il était à peu près Service ASMX dans un .NET plus ancien.

Je me demande comment le faire dans le service WCF .NET 4.5?

+0

Où cette exeption est-elle lancée? Au côté serveur ou côté client? Et avez-vous d'abord un DateTime non nullable que vous avez changé en DateTime nullable? Dans ce cas, avez-vous également actualisé votre référence côté client? –

+0

Monsieur, on dirait que vous avez raison, il semble que je n'ai pas actualisé le côté client dans WCF Storm ... Merci, s'il vous plaît postez comme réponse – evictednoise

Répondre

1

Il semble que vous ayez eu un DateTime (côté serveur et client) et que vous ayez modifié le DateTime en DateTime nullable, mais n'avez pas mis à jour le côté client.

Le côté client attend maintenant toujours un DateTime (donc null autorisé) mais le serveur envoie une valeur null. D'où l'exception.

Veuillez mettre à jour la référence de service côté client.

0

Attention à l'analyse XML. L'élément n'est pas un null valide. Ceci est considéré comme une chaîne vide et donc non convertible en un datetime. Pour qu'il soit nul, il doit avoir cet attribut spécial nill = true.

Une précision: Si vous avez un élément xml livre et l'un des éléments de l'enfant est le livre: série, vous avez plusieurs options lors de le remplir:

Retrait de l'élément entièrement - Cela peut être fait lorsque vous souhaitez pour indiquer que la série ne s'applique pas à ce livre ou que ce livre ne fait pas partie d'une série. Dans ce cas, xsl transforme (ou d'autres processeurs basés sur des événements) qui ont un modèle qui correspond à book: series ne sera jamais appelé. Par exemple, si votre xsl transforme l'élément livre en ligne de table (xhtml: tr), vous pouvez obtenir le nombre incorrect de cellules de tableau (xhtml: td) en utilisant cette méthode. Laisser l'élément vide - Cela peut indiquer que la série est "", ou est inconnue, ou que le livre ne fait pas partie d'une série. Toute transformation xsl (ou autre analyseur basé sur evernt) qui correspond à book: series sera appelée. La valeur de current() sera "". Vous obtiendrez le même nombre de balises xhtml: td en utilisant cette méthode qu'avec la suivante. Utilisation de xsi: nil = "true" - Cela signifie que l'élément book: series est NULL, pas seulement vide. Votre transformation xsl (ou autre analyseur basé sur les événements) qui ont un modèle de livre correspondant: série sera appelée. La valeur de current() sera vide (chaîne non vide). La principale différence entre cette méthode et (2) est que le type de schéma de livre: série n'a pas besoin d'autoriser la chaîne vide ("") comme une valeur valide. Cela n'a aucun sens pour un élément de série, mais pour un élément de langage défini comme un type énuméré dans le schéma, xsi: nil = "true" permet à l'élément de ne pas avoir de données. Un autre exemple serait des éléments de type décimal. Si vous voulez qu'ils soient vides, vous pouvez unir une chaîne énumérée qui n'autorise que "" et une décimale, ou utiliser un nombre décimal qui est nul.