Serialisation/deserialisation d'une structure

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 395 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_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
28 -
Ca a le mérite d'etre simple clair et concis.

Très bien
cs_Willi
Messages postés
2377
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
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
_Fabien
Messages postés
119
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
28 avril 2008
-
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.
Afyn
Messages postés
613
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016
-
Et si un fichier binaire est structuré ? (comme un fichier Midifile par exe ...) est ce qu'on peut le lireplus facilement ?

Afyn - Navedac
fdiedler2000
Messages postés
383
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
1 décembre 2008
-
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

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.