Serialisation/deserialisation d'une structure

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 524 fois - Téléchargée 23 fois

Contenu du snippet

Enfin !

Depuis 3 semaines, je cherchais à écrire une structure dans un fichier binaire. J'ai enfin réussi. Ce code écrit 5 enregistrements dans un fichier binaire, puis les lit, tout simplement ! Il faut passer par la sérialisation/désérialisation.

J'ai mis un seul commentaire car je pense que le code est assez clair (?)

Source / Exemple :


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

Conclusion :


Bon je ne sais pas parcourir un fichier alors j'ai mis un "Try". En effet, While not (result is nothing) ne marche pas : le compilateur bloque sur le Is.

Pour les newbies, comme moi, pour faire marcher ce programme :
1/Ouvrez un projet vide.
2/Ajouter un fichier vide.
3/Faites un copier-coller de mon code.
4/Lancer la compilation.

n.b.Cet exemple est intéressant car il lit plusieurs enregistrements. Dans tous les exemples/tutos lus, seul un enregistrement était concerné.

J'espère que ce code aidera les débutants comme moi, qui ont galéré pour écrire de simples structures dans un simple fichier binaire. A noter que cet exemple doit aussi marcher pour les objets. Dans ce cas, il faut remplacer le Structure par Class.

A voir également

Ajouter un commentaire

Commentaires

cs_Kite37
Messages postés
242
Date d'inscription
lundi 6 mars 2006
Statut
Membre
Dernière intervention
17 janvier 2018

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
2
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

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
2
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

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'."

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.