IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[DataContract] Sérialiser le type "object"


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut [DataContract] Sérialiser le type "object"
    Bonjour,

    Je serialise un object dont la classe possède une propriété de type "object".
    Le type réel de la propriété ne pourra être qu'un type simple (int, double,...).
    J'obtient la résultat suivant pour cette propriété:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <MyProperty xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:int">5</MyProperty >
    Je voudrais avoir un résultat plus "lisible" du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <MyProperty>5</MyProperty >
    J'ai rajouté l'attribut KnownType à ma classe mais cela n'a rien changé.

    Est-ce qu'il existe un moyen de rendre la sérialisation plus lisible ?

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    C'est le comportement attendu, en effet sinon comment ferait le deserializer pour déterminer le type de destination?

    Il existe au moins deux solutions:

    1) créer une hiérarchie de classes spécialisées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [DataContract]
    [KnownType(typeof(AAD))]
    [KnownType(typeof(AAI))]
    class AA
    {
    }
     
    [DataContract]
    class AAI : AA
    {
    	[DataMember]
    	public int N { get; set; }
    }
     
    [DataContract]
    class AAD : AA
    {
    	[DataMember]
    	public double N { get; set; }
    }
    2) Utiliser une propriété de type string et faire le mapping:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [DataContract]
    class AAA
    {
    	public object O { get; set; }
     
    	[DataMember(Name="N")]
    	public string S
    	{
    		get
    		{
    			IFormattable f = O as IFormattable;
    			return f != null ? f.ToString(null, CultureInfo.InvariantCulture) : O.ToString();
    		}
    		set
    		{
    			int n;
    			if (int.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out n))
    			{
    				O = n;
    				return;
    			}
     
    			double d;
    			if (double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out d))
    			{
    				O = d;
    				return;
    			}
     
    			O = value;
    		}
    	}
    }
    Je préfère la 2ème car moins invasive...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut
    Merci Je pars sur la 2ieme solution.

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo