Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
28 avril 2010 3 28 /04 /avril /2010 07:47

Mon objectif est le suivant : Sauvegarder dans un même fichier XML les données d’un Dataset et les préférences de l’utilisateur pour faire une sauvegarde globale de mon application.

Un dataset est par nature “Serializable” mais il n’en est pas de même pour l’objet My.Settings dont le niveau de protection est trop élevé pour être sérialisé.

J’ai donc décidé de faire une classe personnalisée “Serializable” pour stocker les préférences de l’utilisateur et une extension “My.Preferences”

 

Pour sérialiser et désérialiser des objets j’ai créé une classe dans l’espace de nom HC.Xml dont voici le code :

Code:

Imports System.Xml
Imports System.IO
Imports System.Xml.Serialization

Public Class Serialization

    Private _obj As Object

    Public Sub New(ByVal obj As Object)
        _obj = obj
    End Sub

    Public Sub WriteToXmlFile(ByVal filePath As String)
        Dim stream As StreamWriter = New StreamWriter(filePath)
        Dim serializer As XmlSerializer = New XmlSerializer(_obj.GetType)
        serializer.Serialize(stream, _obj)
        stream.Close()
    End Sub

    Public Function ConvertXmlFileToObject(ByVal filePath As String)
        Dim stream As StreamReader = New StreamReader(filePath)
        Dim serializer As XmlSerializer = New XmlSerializer(_obj.GetType)
        _obj = serializer.Deserialize(stream)
        stream.Close()
        Return _obj
    End Function

End Class

 

J’ai ensuite créé ma classe personnalisé “customSettings” qui est dans l’espace de nom Version1 de mon application :

 

Code :

Imports System.Xml
Imports System.Xml.Serialization

Namespace Version1
    <Serializable(), XmlRoot()> _
    Public Class customSettings

        Public Sub New()
            Me.Load()
        End Sub

        Public Sub Save()
            Dim xmlFile As New HC.Xml.Serialization(Me)
            xmlFile.WriteToXmlFile(My.Application.Info.DirectoryPath & "preferences.xml")
        End Sub

        Public Sub Load()
            Dim filePath As String = My.Application.Info.DirectoryPath & "preferences.xml"
            If My.Computer.FileSystem.FileExists(filePath) Then
                Dim xmlFile As New HC.Xml.Serialization(Me)
                xmlFile.ConvertXmlFileToObject(filePath)
            End If
        End Sub

        Private chargesSurVenteValue As Decimal = 13
        <XmlElement()> _
        Public Property ChargeSurVente() As Decimal
            Get
                Return chargesSurVenteValue
            End Get
            Set(ByVal value As Decimal)
                chargesSurVenteValue = value
            End Set
        End Property

        Private chargesSurServiceValue As Decimal = 23
        <XmlElement()> _
        Public Property ChargesSurService() As Decimal
            Get
                Return chargesSurServiceValue
            End Get
            Set(ByVal value As Decimal)
                chargesSurServiceValue = value
            End Set
        End Property

    End Class
End Namespace

 

 

Je dois maintenant ajouter cette classe à l’espace de nom My :

 

Code :

Namespace My
    <HideModuleName()> _
    Module customPreferences
        Private _pref As New ThreadSafeObjectProvider(Of customSettings)
        Public ReadOnly Property Preferences As customSettings
            Get
                Return _pref.GetInstance
            End Get
        End Property
    End Module
End Namespace

Remarquez que si “HideModuleName” n’était pas spécifié, nous aurions My.customPreferences.Preferences au lieu de My.Preferences. 

 

Voilà, je peux désormais utiliser My.Preferences pour stocker les préférences de mon utilisateur. Lorsque je utilise la méthode My.Preferences.Save, l’objet est sérialisé et sauvegarder dans le fichier xml “preferences.xml” dans le répertoire de mon application. La méthode Load permet de désérialiser l’objet pour récupérer les données et est appelé dans le constructeur.

 

Pour pouvoir faire ma sauvegarde globale, il ne me reste plus qu’a créer une classe “serializable” contenant mon dataset et mes préférences.

 

Code :

Public Class Backup

        Private ds As New DataSetAGPV1

        Public Sub BackupDatabaseAndSettings(Optional ByVal fileName As String = Nothing)
            Me.FillDataset()

            Dim bkf As New BackupFile
            bkf.DataSet = ds
            bkf.Preferences = My.Preferences

            Dim XmlSerial As New HC.Xml.Serialization(bkf)

            If fileName IsNot Nothing Then
                XmlSerial.WriteToXmlFile(fileName)
             End If
        End Sub

        Private Sub FillDataset()
            For Each dt As DataTable In ds.Tables
                FillTable(dt)
            Next

        End Sub

        Private Sub FillTable(ByVal dt As DataTable)
            Using con As New SqlConnection(My.Settings.dbAGPV1ConnectionString)
                Using da As New SqlDataAdapter("SELECT * FROM " & dt.TableName, con)
                    da.Fill(ds, dt.TableName)
                End Using
            End Using
        End Sub

        <Serializable(), XmlRoot()> _
        Public Class BackupFile

            Private _version As String

            Public Sub New()
                _version = My.Application.Info.Version.ToString
            End Sub

            <XmlAttribute()> _
            Public Property Version As String
                Get
                    Return _version
                End Get
                Set(ByVal value As String)
                    _version = value
                End Set
            End Property

            Private ds As DataSetAGPV1
            <XmlElement()> _
            Public Property DataSet() As DataSetAGPV1
                Get
                    Return ds
                End Get
                Set(ByVal value As DataSetAGPV1)
                    ds = value
                End Set
            End Property

            Private preferencesValue As Version1.customSettings
            <XmlElement()> _
            Public Property Preferences() As Version1.customSettings
                Get
                    Return preferencesValue
                End Get
                Set(ByVal value As Version1.customSettings)
                    preferencesValue = value
                End Set
            End Property

        End Class

    End Class

 

La classe Backup charge les données dans le dataset avant de le mettre dans la classe “serializable” BackupFile avec les préférences. Ensuite la classe Backup file est sérialisé et sauvegardée sous la forme d’un fichier XML. J’ai ainsi sauvegarder les données de mon application et les préférences de l’utilisateur dans un même fichier.

La classe BackupFile contient également une propriété “Version” qui permet, lors de la restauration de données, de vérifier si la version de l’application et de la sauvegarde sont les même.

Partager cet article

Repost 0
Published by Cyril - dans VB.NET
commenter cet article

commentaires