Sérialiser la classe Queue ???

Résolu
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
- 19 juin 2007 à 10:02
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
- 19 juin 2007 à 18:51
Bonjour à tous !

Je voudrais pouvoir sérialiser la collection de type Queue mais je n'y arrive pas !
Quelqu'un peut il m'aider ?

Merci à tous !

(VS2005fr, frk2.0)

15 réponses

SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
19 juin 2007 à 15:53
Excuse-moi, j'avais remis
System.Xml.Serialization.XmlSerializerser = newSystem.Xml.Serialization.XmlSerializer(typeof(Queue<string>));

Pour avoir le messafe d'erreur,
il faut bien sûr mettre :
System.Xml.Serialization.XmlSerializerser = newSystem.Xml.Serialization.XmlSerializer(typeof(string[]));

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
3
cs_niky
Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
19 juin 2007 à 11:11
Salut,

La classe est marquée comme sérialisable, il ne devrait pas y avoir de problème. Il faut juste que les éléments que tu mets dans une queue soient aussi sérialisables :

Queue queue = new Queue();
// ...
FileStream fs = new FileStream(nomDuFichier,
FileMode.create)
SoapFormatter sf = new SoapFormatter(); // Tu peux utiliser un autre formatter
sf.Serialize(fs, queue)
fs.Close();
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 11:40
Ca ne fonctionne pas, je cherche d'ou ça peut venir.

J'utilise un XmlSerialiser.

J'ai une classe que je sérialise et qui contient une propriété de type Queue<string>.
0
cs_niky
Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
19 juin 2007 à 11:45
Tu pourrais détailler ce que tu entends par "ça ne fonctionne pas" ?
Tu obtiens une exception à la sérialisation ? à la désérialisation ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 11:50
pour l'instant je ne fait que sérialiser, voici mon erreur :

InvalidOperationException
Une erreur s'est produite lors de la réflexion du type 'TRAV2.Modele'.

Modele étant ma classe.

Merci de ton aide
0
cs_niky
Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
19 juin 2007 à 11:56
Est-ce que tu sérialises la classe TRAV2.Modele ?
Si c'est le cas, et même si tous ses attributs sont sérialisables, elle doit être marquée sérialisable.
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 11:59
Oui je la sérialise :

[System.

SerializableAttribute()]
[System.Xml.Serialization.
XmlTypeAttribute(AnonymousType =
true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace "", IsNullable
false)]

public
class
Modele :
IModele
{
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
19 juin 2007 à 12:03
Non, l'attribut Serializable n'est pas indispensable pour les serialization xml avec XmlSerializer

<hr />
-Blog-
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 12:07
Avec ou sans, j'ai toujours la même erreur, je désespère !
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 14:02
Quelqu'un a t'il déja sérialiser une collection Queue<string> avec un XmlSerialiser ?
Merci d'avance
0
SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
19 juin 2007 à 14:28
Hello,

En effet, je viens de tester, et il n'y a pas moyen de sérializer une queue.
Le message d'erreur est le suivant :

You must implement a default accessor on System.Collections.Generic.Queue`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] because it inherits from ICollection.

Comme je ne vois pas de moyen d'implémenter ça, j'aurais recours à un petit truc : sérializer/désérializer un tableau :

//Sérialization
Queue<string> q = newQueue<string
>();
q.Enqueue("Test1"
);
q.Enqueue("Test2"
);
q.Enqueue("Test3"
);
using (FileStreamfs = File.OpenWrite(@"c:\temp\testQueue.xml"
))
{
System.Xml.Serialization.XmlSerializerser = newSystem.Xml.Serialization.XmlSerializer(typeof(Queue<string
>));
ser.Serialize(fs, q.ToArray
());
}

//Désérialization
using
(FileStreamfs = File.OpenRead(@"c:\temp\testQueue.xml"
))
{
System.Xml.Serialization.XmlSerializerser = newSystem.Xml.Serialization.XmlSerializer(typeof(string
[]));
q = newQueue<string>((string[])ser.Deserialize(fs
));
}

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 15:38
merci beaucoup, je vais voir ce que je peux faire avec !
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 15:50
Bon je viens de tester, ca plante avec le même message d'erreur que toi :

using

(
FileStream fs =
File.OpenWrite(path))
{

      XmlSerializer ser =
new
XmlSerializer(
typeof(
Queue<
string>)); //erreur
      ser.Serialize(fs, modele.EtapesAnterieur.ToArray());
}

Vous devez implémenter un accesseur par défaut sur System.Collections.Generic.Queue`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], car il hérite de ICollection.
0
EmacLi
Messages postés
165
Date d'inscription
jeudi 3 novembre 2005
Statut
Membre
Dernière intervention
1 février 2013
1
19 juin 2007 à 16:17
merci
0
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
19 juin 2007 à 18:51
Oui c'est normal, un Serializer itère dans une collection à la recherche d'élément à Serializer.
Si la collection n'implémente pas ICollection (ou ICollection<T>), le Serializer ne peut pas faire son travail correctement. La class Queue n'implémente pas une telle interface.

Une solution serait donc de dériver de Queue et de faire implémenter cette nouvelle classe de ICollection. Les méthodes Add, Remove appelerais les méthodes Queue et Enqueue...
Puis, Il faut encore implémenter un accesseur,...

Ensuite, on devrait avoir une class Queue qui peut être sérializée, mais avec certains désavantages (comme l'ajout des méthodes Add et Remove en plus de Queue et Enqueue).

Bref, je ne suis pas sûr que cette solution soit très bonne

<hr />
-Blog-
0