SERIALISATION/DESERIALISATION D'UNE STRUCTURE

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 12 janv. 2007 à 12:00
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018 - 27 févr. 2007 à 16:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41077-serialisation-deserialisation-d-une-structure

cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
27 févr. 2007 à 16:47
malkuth, je crois que je t'aime lol :) merci problème réglé :)
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
27 févr. 2007 à 15:49
Je ne voit pas se qui t'empêche d'utilisé System.Drawing dans une DLL, il faut juste l'ajouter dans les référence du projet de bibliothèque(click droit sur le projet, ajouter une référence onglet .NET, System.Drawing ;-) ).
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
27 févr. 2007 à 08:26
le problème, c'est que je cherche entre autre a sérialiser des bitmap, et je ne peux pas importer system.drawing, qui les contients, dans une projet bibliothèque de classe :s

D'après mes recherches, il vaudrait mieux se pencher sur les serializationBinder.
Je vous tiens au courant si je trouve la solution et que sa marche ..
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
26 févr. 2007 à 19:58
Je dirait, qu'il faut que tu créé ta classe sérializable dans une DLL(type de projet bibliothèque de classe), ensuite, dans tes deux projets, tu ajoute la référence vers le projet ou la DLL.
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
26 févr. 2007 à 14:45
hmm rebonjour les gens !
Bien alors j'ai fais mon éditeur de map, pas de problèmes lors de la sérialisation, et je peux désérialiser mon fichier comme il faut.
Mais uniquement avec l'éditeur meme, impossible de désérialiser ce fichier avec un autre logiciel ! autrement dis, je peux désérialiser ma map dans l'éditeur pour la modifier, mais je ne peux pas la lire dans le jeu :(

Quelqu'un a une idée?
voici l'erreur qui se produit :

"Impossible de trouver l'assembly 'Editeur de Map, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'."
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
2 févr. 2007 à 17:54
J'ai transformé ma structure en classe et l'ai mise dans uun fichier DLL :

http://www.vbfrance.com/code.aspx?ID=41347
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
19 janv. 2007 à 10:45
Ravi que ce code ait intéressé (et continuera d'intéresser) quelques personnes. Bon courage pour ton projet Kite37 : le mien avance à grand pas depuis ce problème de sérialisation. Il est même pratiquement fini.
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
18 janv. 2007 à 19:24
j'ai fait quelques tests rapide avec des classes d'essaie tappées en 2 minute, et mettant des images et compagnie, et bien tout a l'air de marcher parfaitement !

Merci beaucoup pour ton aide malkuth, et a toi aussi _fabien pour avoir posté ce code qui me permettra surement de réaliser quelques chose de très bien pour un prochain jeu :)

@ bientot, cordialement, KiTe
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
18 janv. 2007 à 09:41
On peut les serializer mais je suis pas sur que le format soit compressé...à vérifier.
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
16 janv. 2007 à 18:41
pendant que j'y suis, une toute dernière question (promis) :

peut-on sérialiser des images? par exemple si j'associes une image a une case, je peuxla sérialiser pour pouvoir la load directement par la suite?

merci pour les réponses déja postées en tout cas :) et bon travail _Fabien, tout de même :)
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
16 janv. 2007 à 18:24
merci beacoup c'est sympa ^^
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
16 janv. 2007 à 13:05
Pour fdiedler2000 :

Imports System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
Imports System.IO

Public Module Module1

Dim nom_fichier As String = "test.bin"

<Serializable()> _
Public structure HighScore

' attributs
Private _pseudo As String
Private _score As Integer
Private _reussite As Double
Private _duree_jeu As TimeSpan

' propriétés
Public Property pseudo() As String
Get
Return _pseudo
End Get
Set(ByVal value As String)
_pseudo = value
End Set
End Property

Public Property score() As Integer
Get
Return _score
End Get
Set(ByVal value As Integer)
_score = value
End Set
End Property

Public Property reussite() As Double
Get
Return _reussite
End Get
Set(ByVal value As Double)
_reussite = value
End Set
End Property

Public Property duree_jeu() As TimeSpan
Get
Return _duree_jeu
End Get
Set(ByVal value As TimeSpan)
_duree_jeu = value
End Set
End Property

' Constructeur
Public Sub New(ByVal __pseudo As String, ByVal __score As Integer, _
ByVal __reussite As Double, ByVal __duree_jeu as TimeSpan)
_pseudo = __pseudo
_score = __score
_reussite = __reussite
_duree_jeu = __duree_jeu
End Sub

End Structure


Public sub Serialize(ByVal struct As HighScore, ByVal fichier As String)

Dim serializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim stream As FileStream

'If struct Is Nothing Then Return False
If Not File.Exists(fichier) Then
stream = New FileStream(fichier, FileMode.Create)
Else
stream = New FileStream(fichier, FileMode.Append)
End If

serializer.Serialize(stream, struct)
stream.Close()

End sub


Public Function Deserialize(ByVal fichier As String) As Boolean

Dim deserializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim stream As FileStream
Dim result As HighScore

If Not File.Exists(fichier) Then
return false
else
stream = New FileStream(fichier, FileMode.Open)

While True
Try
result = deserializer.Deserialize(stream)
Console.WriteLine("Pseudo : {0}, score : {1} bonnes réponses, reussite : {2}%, temps : {3}.", result.pseudo , result.score, result.reussite, result.duree_jeu)
stream.Flush
Catch
Exit While
End Try
End While

stream.Close()
console.ReadLine
return true
End If

End Function

Sub Main()
' TimeSpan exprime une durée
Dim duree As New TimeSpan(1000000000000)

Serialize(New HighScore("Fabien",15,70.5,duree), nom_fichier)
Serialize(New HighScore("Casy",13,80.33,duree), nom_fichier)
Serialize(New HighScore("Willy",13,70.67,duree), nom_fichier)
Serialize(New HighScore("X",11,98.5,duree), nom_fichier)
Serialize(New HighScore("CharlesRacaud",10, 92.15,duree), nom_fichier)

If not Deserialize(nom_fichier) Then
Console.WriteLine("Le fichier n'existe pas.")
End If

End Sub

End Module
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
16 janv. 2007 à 10:44
c'est pourtant ce que j'ai fait mais j'ai les numéro des lignes ! lol j'ai pas de chance tans pis :(

Bonne source au passage

Merci
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
16 janv. 2007 à 10:20
fdiedler2000, je sélectionne tout à la souris puis Ctrl+C ou Edition->Copier.

Intéressant Malkuth !

Kite37, non ! Dans mon code, je les récupère une par une séquentiellement. Ensuite est-ce possible de récupérer ou modifier directement que la 3ème par exemple ? Sans doute. Faut voir les méthodes proposées.
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
15 janv. 2007 à 18:45
merci beaucoup pour ta réponse sa va m'être d'une aide très précieuse :)
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
15 janv. 2007 à 13:33
PS : C'est tous a fais possible pour les classes , pour ce qui est de sérialser des tableux, le plus simple est de mettre le tableau dans une collection et de sérialiser la collection, lors de la désérialisation tu récupère une collection avec tous tes objets dedans. ex :

'Création de la collection
Dim duree As New TimeSpan(1000000000000)
Dim HighScores as new System.collections.generic.List(of HighScore)(
new HighScore(){
New HighScore("Fabien",15,70.5,duree),
New HighScore("Casy",13,80.33,duree),
New HighScore("Willy",13,70.67,duree),
New HighScore("X",11,98.5,duree),
New HighScore("CharlesRacaud",10, 92.15,duree),
}
);


'Sérialisation(Autres procédure)
Dim serializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
New Runtime.Serialization.Formatters.Binary.BinaryFormatter

Dim stream As FileStream = New FileStream(fichier, FileMode.Create)
serializer.Serialize(stream, HighScores)
stream.Close()

'désérialisation(Autres procédure)
Dim deserializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim stream As FileStream = New FileStream(fichier, FileMode.Open)
Dim HighScores as System.collections.generic.List(of HighScore)= deserializer.Deserialize(stream)
stream.Close()

Ca résoud aussi le problème de savoir quand s'arreter de lire le fichier réponse : c'est pas mon problème c'est la désérialisation de la collection qui s'en occupe.

donc le mieux c'est de sérialiser un objet unique
par example pour la map d'un jeu on crée un classe de ce genre :

Classe MAP
Chaine Nom
Nombre Version
List(Of Block) Bloks
Fin Classe

Classe Block
Image ImageFond
int CoordX
int CoordY
Fin Classe

et lors de la sérialisation d'un objet MAP, les Objet Block sont sérialisé de manière transparente et vice versa pour la déserialisation toutefois tous les objet de la hiérarchie doivent être sérializable (sauf avec les attribut voir msdn).
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
15 janv. 2007 à 13:04
C'est super la sérialisation mais ils faut faire trés attention pour que le programme soit évolutif, tout en restant compatible avec les fichier d'ancienne version et il faut noté que le sérialisation binaire demande certains droits, je vous conseille si vous avez trouver cette sources intérréssante de bien regarder dans la MSDN.

Il y'a en .net un deuxième type de sérialisation : la sérialisation XML sont avvantage est de produire des fichier XML c'est trés pratique lors du debbugage et on peut les modifier dans un simple notepad.
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
14 janv. 2007 à 13:03
je me pose une question : si dans le fichier tu sérialise plein de données, comment trouver celle voulue, ou toute les récupérer? car d'après ton code tu n'en récupère qu'une ..

moi par exemple, pour un jeu, je veux sérialiser la map. Deux choix s'offre a moi :
-Sérialiser chaque case de la map une par une
-Sérialiser directement la map avec le tableau de case.

Quel serait le choix le plus judicieux?
et est-ce possible de sérialiser des tableaux d'une structure différente de celle d'origine?
(ici, la structure map, ou la classe map, serait sérialisée, mais les "cases" apparaissant dans le tableaux appartiendrait a une autre structure..comment faire?)

Et une dernière question, est-il possible de faire de meme avec des classes?

Merci d'avance pour les réponses ^ ^
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
13 janv. 2007 à 20:46
Vous avez de la chacne moi il me prends les ligne... Vous utilisez un Ctrl C puis Ctrl V dans l'IDE ?
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
13 janv. 2007 à 19:18
Afyn, je ne sais pas ; je débute. A toi de creuser la question.

fdiedler2000 : ah bon ! Quand je sélectionne le code, il ne me prend pas les lignes. D'ailleurs, pleins de codes sont présentés comme le mien.

J'utilise IE7. Essayé aussi avec FireFox 2.0.0.1, pas de soucis non plus.

Willy, pour l'instant, je n'ai pas le temps et suis-je capable de le faire ? Je dois poursuivre mon projet perso pour mieux me former au VB.Net, mais si quelqu'un veut le faire, pas de problème.
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
13 janv. 2007 à 12:17
tu devrais mettre un zip car quand on fait copier / coller pour ton code et bah on à le numéro des lignes aussi et donc il faut les enveler une par une et c'est chiant à terme surtout si le code est long !

Merci
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
12 janv. 2007 à 17:36
Et si un fichier binaire est structuré ? (comme un fichier Midifile par exe ...) est ce qu'on peut le lireplus facilement ?

Afyn - Navedac
_Fabien Messages postés 119 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 28 avril 2008
12 janv. 2007 à 12:58
Pas bête Willi !

Voici la seconde version : j'ai ajouté un timespan pour montrer que l'on peut sérialiser autre chose que des nombres et des strings.
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
12 janv. 2007 à 12:20
Je ne sais pas quelle version de vb dont tu disposes, je te conseilles d'en faire une classe générique pour Serialier/déserialiser un objet/une structure.

Bonne continuation
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 janv. 2007 à 12:00
Ca a le mérite d'etre simple clair et concis.

Très bien
Rejoignez-nous