Sérialisation/désérialisation binaire d'une classe

Soyez le premier à donner votre avis sur cette source.

Vue 9 024 fois - Téléchargée 431 fois

Description

Création d'une DLL (classe High-Score) avec possibilité de (dé)sérialisation.
Le fichier zip comporte 2 sources :

- la classe HighScore (à compiler dans une bibliotèque de classe). A noter : dans les propiétés de la solution, vous devez laisser vide le "Namespace racine".

- le module (programme principal) qui fait appel à la classe : vous devez importer la classe "HighScore.dll" dans vos références avant de lancer le programme.

Source / Exemple :


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

<Serializable()> _
Public Class 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

  Public Shared 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 Shared Function Nb_Enregistrements(ByVal fichier As String) As Integer

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

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

      While True
        Try
          result = deserializer.Deserialize(stream)
          nb += 1
          stream.Flush
        Catch
          Exit While
        End Try         
      End While

      stream.Close()
      return nb
    End If

  End Function

  Public Shared Function Deserialize(ByVal fichier As String, ByRef t_HS() as HighScore) As Integer

    Dim deserializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
                    New Runtime.Serialization.Formatters.Binary.BinaryFormatter
    Dim stream As FileStream 
    Dim i, nb as Integer

    If Not File.Exists(fichier) Then
      return -1
    Else
      Try
        nb = Nb_Enregistrements (fichier)
        ReDim t_HS(nb)
      Catch
        console.Write ("Impossible de déterminer le nombre d'enregistrements.")
        console.ReadKey
        Exit Function
      End Try

      stream = New FileStream(fichier, FileMode.Open)

      For i=0 to nb-1
        t_HS(i) = deserializer.Deserialize(stream)
        stream.Flush
      Next

      stream.Close()
      return nb
    End If
  End Function

  ' Constructeur
  Public Sub New(ByVal pseudo As String, ByVal score As Integer, _
                 ByVal reussite As Double, ByVal duree_jeu as TimeSpan)
    Me._pseudo = pseudo
    Me._score = score
    Me._reussite = reussite
    Me._duree_jeu = duree_jeu
  End Sub

End Class

Conclusion :


Cette source fait suite à celle-ci : http://www.vbfrance.com/codes/SERIALISATION-DESERIALISATION-STRUCTURE_41077.aspx

Codes Sources

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.