Sérialisation d'une ArrayList

[Résolu]
Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
Messages postés
24
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
24 novembre 2008
-
Bonjour,

J'ai un petit problème quand j'essaie de sérialiser une ArrayList. Apparemment, les objets contenus dans la liste sont d'un type inattendu. J'ai essayé de mettre un XmlInclude pour spécifier le type des objets, mais ca ne change rien.

    [XmlInclude(typeof(Classe))]
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList l = new ArrayList();
            l.Add(new Classe(2));
            l.Add(new Classe(3));
            l.Add(new Classe(4));

            System.IO.StringWriter oWriter = new System.IO.StringWriter();
            XmlSerializer serializer = new XmlSerializer(l.GetType());
            serializer.Serialize(oWriter, l);
            Console.WriteLine(oWriter.ToString());
        }
    }

La classe des objets que je veux sérialiser:

   public class Classe
    {
        private int x;

        public int X
        {
            get { return x; }
            set { x = value; }
        }

        public Classe(int x)
        {
            this.x = x;
        }

        private Classe()
        {
        }
    }

Merci de votre aide

_____________________________________
Un éditeur de ressources gratuit pour Windows

4 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Salut,
Essayes quelques choses comme ceci:

public

class
Program
{
  
public
static
void Main(
string[] args)
   {
     
ArrayList al =
new
ArrayList();
      al.Add(
new
Classe(2));
      al.Add(
new
Classe(3));
      al.Add(
new
Classe(4));

     
StringWriter oWriter =
new
StringWriter();
     
XmlSerializer serializer =
new
XmlSerializer(
typeof(
ArrayList),
new
Type[] {
typeof(
Classe) });
      serializer.Serialize(oWriter, al);
     
Console.WriteLine(oWriter.ToString());
   }
}

[
Serializable()]

public
class
Classe
{
  
private
int _x = 0;

  
private Classe()
   {
   }

  
public Classe(
int x)
   {
     
this._x = x;
   }

  
public
int X
   {
     
get {
return
this._x; }
     
set {
this._x =
value; }
   }
}

<hr size="2" />-Blog-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Ceci étant certainement du au fait que le Serializer ne sait pas à quoi s'attendre avec le type ArrayList, il faut donc lui spécifier "manuellement".
Remarque qu'avec .NET2 on préférera faire une collection typée et donc d'avoir qqch du genre :

List<Classe> al = new List<Classe>();
al.Add(newClasse(2));
al.Add(newClasse(3));
al.Add(newClasse(4));

StringWriter oWriter = newStringWriter();
XmlSerializer serializer = newXmlSerializer(typeof(List<Classe>)):
Console.WriteLine(oWriter.ToString());

<hr size="2" />-Blog-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
J'avais essayé avec une LinkedList<Classe> et ca ne marchait pas, mais avec List<Classe> ca marche bien
Ta première réponse me convient aussi, mais je prends la seconde :)
Merci beaucoup!

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
24
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
24 novembre 2008

Bonjour,

Bidou, j'ai vu que tu as répondu a plusieurs posts sur le sujet,
effectivement pour sérialiser une arraylist d' objets de type primitif
(string, int) pas de probleme par contre j'essaie en vain de serialiser
une arrayList d'objet de monType.

J'obtiens l'erreur suivante,

The remote server returned an error: (500) Internal Server Error.
There was an error reflecting type 'System.Collections.ArrayList'.

 en utilisant le code suivant.
[Serializable]public class ressource
    {
        int id;
        public String libelle;
       
        public ressource(String _libelle)
        {
        libelle=_libelle;
        }
       
        public virtual String affichage(){
      
          return "id : "+id+" libelle : "+libelle;
        }
    }

Autre part dans le code
ArrayList al = new ArrayList();
            al.Add(new salle("EB28",40));
            al.Add(new salle("info4",40));
            al.Add(new salle("eh2",40));

            StringWriter oWriter = new StringWriter();
            XmlSerializer serializer = new XmlSerializer(typeof(ArrayList), new Type[] { typeof(ressource) });
            serializer.Serialize(oWriter, al);
            Console.WriteLine(oWriter.ToString());
            return "Hello World";

Je précise que salle hérite de ressource et que salle est aussi sérialisable.

Je vois que tu fais une liste fortement typée, ce que je
n'ai pas pu faire. Je travaille avec monodevelop sous Kubuntu.

Je n'ai pa vu de balises code désolé pour les couleurs.

Le bruit ne fait pas de bien
Le bien de fait pas de bruit