Deserialize une ressources

Résolu
philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012 - 25 sept. 2012 à 11:58
philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012 - 10 oct. 2012 à 18:01
Bonjour à tous, je rencontre actuellement un problème dans la sub suivante:

Public Sub LoadConfig()

                'On regarde quelle config on prend
                Dim Filecfg As String = Nothing
                If File.Exists(My.Application.Info.DirectoryPath & "" & _CfgFile) Then
                    Filecfg = My.Application.Info.DirectoryPath & "" & _CfgFile
                Else
                    Filecfg = My.Resources.DefCfg
                End If

                'On va lire le fichier
                Dim s As XmlSerializer : Dim _config As XmlCfg : Dim r As TextReader = Nothing


                Try
                    s = New XmlSerializer(GetType(XmlCfg))
                    r = New StreamReader(FileCfg)
                    _config = CType(s.Deserialize(r), XmlCfg)
                    _sections = New ArrayList
                    Dim i As Integer = 0
                    Do While (i < _config.NbSections)
                        Me.AddSection(_config(i))
                        i = (i + 1)
                    Loop

                Catch ex As Exception

                Finally
                    If r IsNot Nothing Then r.Close()

                End Try

            End Sub


En effet je regarde avant de charger un fichier xml si il existe et si il n'existe pas je vais chercher celui situé en ressources. Le problème vient du fait que le streamreader fonctionne quand on lui donne "l'adresse d'un fichier" mais pas quand on lui donne le contenu du fichier.

Le problème est que lorsque je fais le My.resources.DefCfg, je récupére le contenu xml.

La question est donc Comment puis-je faire pour Deserialize ma ressource" afin de créer l'objet en fonction des valeur?

Merci pour vos conseils et votre aide.

5 réponses

philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012
10 oct. 2012 à 18:01
Merci pour les aides et désolé du retard mais je n'ai pas su retravailler sur le problème avant aujourd'hui.

Donc voici ma solution qui semble fonctionner comme je le souhaite.


''' <summary>
            ''' Chargement de la configuration
            ''' </summary>
            ''' <remarks></remarks>
            Private Sub LoadConfig()

                Dim Filecfg As String = Nothing
                Dim sr As StreamReader = Nothing
                Dim ser As XmlSerializer = Nothing
                Dim reader As StringReader = Nothing

                Try
                    'On recupère les données pour deserealize
                    If File.Exists(My.Application.Info.DirectoryPath & "" & CFG_FILE) Then 'on recupère le contenu du fichier si exist
                        sr = New StreamReader(My.Application.Info.DirectoryPath & "" & CFG_FILE)
                        Filecfg = sr.ReadToEnd()
                    Else
                        Filecfg = My.Resources.DefCfg
                    End If

                    'On deserialize
                    ser = New XmlSerializer(GetType(XmlCfg))
                    reader = New StringReader(Filecfg)

                    'On set les données
                    Me.Sections = CType(ser.Deserialize(reader), XmlCfg).Sections

                Catch ex As Exception
                    MessageBox.Show("Une erreur est survenue lors de la lecture de la configuration:" & vbNewLine & _
                                    ex.Message, "Erreur de configuration", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Mainerreur = E_MainErreur.BadConfig

                Finally
                    'On ferme tout
                    If sr IsNot Nothing Then sr.Close()
                    If sr IsNot Nothing Then sr.Dispose()
                    If reader IsNot Nothing Then reader.Close()
                    If reader IsNot Nothing Then reader.Dispose()

                End Try

            End Sub


En tout les cas merci
NHenry Messages postés 15142 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
25 sept. 2012 à 12:54
Bonjour,

Pourquoi ne pas simplement enregistré le XML de la ressource sur le disque avant de l'ouvrir ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012
25 sept. 2012 à 13:49
Effectivement c'est une solution à laquelle je n'avais pas pensé.

Seulement, je voulais avoir la possibilité d'un exécutable avec un configuration par défaut (la ressource) qui ne pouvais pas être modifié. Or si j'enregistre le fichier on peut aller le modifier.

Par contre dans le cas d'un paramétrage personnel de l’exécutable on créait un fichier. Ce qui permettait de voir très rapidement (via existence du fichier) si on avait une configuration perso ou par défaut (autrement il faut comparer le fichier sur le disque et celui de la ressource).
philposer Messages postés 18 Date d'inscription samedi 12 février 2005 Statut Membre Dernière intervention 10 octobre 2012
25 sept. 2012 à 13:50
Cette approche (explique avant) est-elle vraiment mauvaise?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15142 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 17 juillet 2024 159
25 sept. 2012 à 20:48
Bonjour,

Voir pour utiliser un MemoryStream alors :
http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx

Mais il faudra utiliser une variable de type Stream et non StreamReader peut être, à voir.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Rejoignez-nous