Déserializer

catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009 - 22 nov. 2005 à 20:01
catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009 - 22 nov. 2005 à 22:44
bonjour,
J'enregistre des formes géométrique dans un fichier mais je n'arrive pas a savoir quand je charge le fichier a savoir si j'ai fini de desérializer ou non.
Pour le moment je fais cela


IFormatter formatter =
new BinaryFormatter();


FileStream stream =
new FileStream("MyFile.bin", FileMode.Open);



try


{



do


{


frmDessin.liste.Add(formatter.Deserialize(stream));


}
while(
true);


}



catch (SerializationException e2)


{


Console.WriteLine("Failed to serialize. Reason: " + e2.Message);



//throw;


}



finally


{


frmDessin.panelDessin.Refresh();


stream.Close();


}

liste est une Arrayliste et frmDessin et ma fenêtre enfant

Pour le moment je sors de ma boucle a cause de l'exception générée lorque j'essais de déserializer une fois que tout est déserializer. Donc j'affiche bien toute mes formes géométrique.

Comment puis faire pour quitter ma boucle sans générer d'exception et apres avoir tous déserializé?

merci

10 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 20:22
Salut,

Il faut que tu te repositionnes en debut de flux : stream.Seek(0, SeekOrigin.Begin);

/*
coq
MVP Visual C#
*/
0
catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009
22 nov. 2005 à 21:49
j'ai du mal a comprendre comment me repositionné en debut de flus peut m'aider a sortir de la boule quand j'ai fini de deserializé pour éviter d'essayé de deserializé une fois le fichier lu completement
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 21:54
Hum, j'avais compris la question de travers :

do-while sert à quoi là ? :
do
{
frmDessin.liste.Add(formatter.Deserialize(stream));
}while(true);

Dans ton cas Deserialize désérialise l'intégralité de ton fichier.

/*
coq
MVP Visual C#
*/
0
catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009
22 nov. 2005 à 21:58
peut etre que j'ai mal compris la serialisation, en fait si je ne fais pas de boucle je récupère seulement le premier rectangle par exemple. La ma boucle me permet de récupérer tous les rectangle mais j'aimerais bien sortir de ma boucle une fois le fichier completement deserializé et non avec l'exception générée
0

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

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 22:12
Ca dépend de ce que tu as sérialiser et comment tu l'as fait.

/*
coq
MVP Visual C#
*/
0
catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009
22 nov. 2005 à 22:16
voici ma fonction de serialisation


IFormatter formatter =
new BinaryFormatter();


FileStream stream =
new FileStream("MyFile.bin", FileMode.Create);



try


{



foreach(RectangleDessin r
in frmDessin.liste)


{


formatter.Serialize(stream, r);


}


}



catch (SerializationException e2)


{


Console.WriteLine("Failed to serialize. Reason: " + e2.Message);



throw;


}



finally


{


stream.Close();


}


RectangleDessin c'est juste une classe contenant un rectangle et tous se qu'il faut pour faire le Pen pour dessiner le rectangle sur le panel
0
catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009
22 nov. 2005 à 22:38
Ben en fait je suis débile, une ArrayList c'est sérialisable
Je me suis compliqué la vie
merci quand même
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 22:38
Ok, je pensais que tu avais sérialiser une liste.
Quand tu désérialises, le BinaryFormater va avancer d'objet en object.
Il te suffit donc avant de tenter une nouvelle passe de vérifier que le flux n'a pas été intégalement lut :
do
{
liste.Add(formatter.Deserialize(stream));
}while(stream.Position < stream.Length);

/*
coq
MVP Visual C#
*/
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 nov. 2005 à 22:41
Oui, ça c'est l'autre solution, la sérialisation directe de la collection.

/*
coq
MVP Visual C#
*/
0
catamenia Messages postés 119 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 21 juillet 2009
22 nov. 2005 à 22:44
merci beaucoup
0
Rejoignez-nous