Sérialisation d'une ArrayList

Résolu
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 4 janv. 2007 à 12:49
cs_Bilou972 Messages postés 24 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 24 novembre 2008 - 12 déc. 2007 à 18:25
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

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
4 janv. 2007 à 13:43
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-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
4 janv. 2007 à 13:48
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-
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 janv. 2007 à 13:53
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
0
cs_Bilou972 Messages postés 24 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 24 novembre 2008
12 déc. 2007 à 18:25
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
0
Rejoignez-nous