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 :

[DataContractSerializer] Sérialiser une collection générique


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 [DataContractSerializer] Sérialiser une collection générique
    Bonjour,

    Je sérialise une ObservableCollection avec le DataContractSerializer.
    J'ai fixé une contrainte sur le type des éléments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MyCollection<T> : ObservableCollection<T> where T : BaseClass
    {
    }
    J'ai définit 2 classes (MyClass1, MyClass2) héritant de BaseClass.
    Le résultat de la sérialisation est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <MyCollection xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    	<BaseClass i:type="MyClass1" />
            <BaseClass i:type="MyClass2" />
    </MyCollection>
    J'aimerais obtenir le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <MyCollection xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    	<MyClass1 />
            <MyClass2 />
    </MyCollection>
    J'ai essayé avec la propriété Name des DataContract mais cela ne change rien

  2. #2
    Membre actif
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Par défaut
    Bonjour,

    petites questions :

    Pourquoi vouloir absolument ce format ?
    Le but de sérializer / déserializer des messages n'est pas pour pouvoir les modifier manuellement après normallement, mais simplement pour définir un format d'échange commun entre plusieurs processus

    Est ce que le xml serializer ne te permettrait pas d'arriver au résultat que tu veux ?
    (là, par contre, ca fait un petit moment que je n'y ai pas touché...)

  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
    La raison c'est qu'au départ j'avais une collection uniquement d'objet de type MyClass1.
    Après, j'ai eu besoin de créer un 2ième type MyClass2 avec des éléments en commun avec MyClass1, d'ou la création de la classe BaseClass.
    Par souci de compatibilité, je voulais conserver le même format.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par al2000 Voir le message
    Par souci de compatibilité, je voulais conserver le même format.
    Je n'ai pas compris ce que le mot compatibilité vient faire ici. Je ne pense pas que ce soit un problème de compatibilité mais plutôt que tu veux que ton fichier xml soit plus simple à lire (rare sont les personnes qui se mettent à lire du contenu XML...)

  5. #5
    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
    Le problème de compatibilité vient du fait que si je désérialise mon fichier XML obtenu avant la création de BaseClass (<MyClass1 />), je ne récupére aucun élément.
    Le DataContractSerializer s'attend à <BaseClass i:type="MyClass1" />.
    Je perd donc toutes les données à moins de modifier les fichiers XML, ce que je voudrais éviter

  6. #6
    Membre actif
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Par défaut
    Autant pour moi, j'avais mal compris le problème

    aucune idée pour le i:type
    en revanche, tu peux pallier à ça en gérant l'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                var dataContractSerializer = new DataContractSerializer(typeof (BaseClass));
                try
                {
                    return (BaseClass)dataContractSerializer.ReadObject(monStream);
                }
                catch (Exception)
                {
                    var xmlSerializer = new XmlSerializer(typeof (BaseClass));
                    return (BaseClass)xmlSerializer.Deserialize(monStream);
                }
    Le code ci-dessus est un exemple, tu peux aussi essayer de conserver l'exception au cas ou tu ais une erreur légitime sur le datacontract serializer.

    après, tu peux également utiliser un parser pour désérialiser ou toute autre méthode, libre à toi.

    Il y a surement mieux, après, tout dépends tes délais et si tu as le temps de retourner le net ou pas...

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

Discussions similaires

  1. Ajout élément dans une collection générique
    Par Methode dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2011, 17h03
  2. Réponses: 2
    Dernier message: 20/04/2007, 01h09
  3. Réponses: 7
    Dernier message: 10/05/2006, 11h15
  4. [VB.NET] Comment peut-on sérialiser une Collection ?
    Par Jabbal'H dans le forum VB.NET
    Réponses: 6
    Dernier message: 09/03/2006, 21h24
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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