Serialisation/deserialisation d'une structure

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

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.