Exception System.IO.FileNotFoundException sur instanciation d'un XmlSerializer

Résolu
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021 - Modifié le 24 mai 2019 à 12:08
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 - 24 mai 2019 à 16:18
Bonjour,

Décidemment, il ne m'arrive que des trucs bizarres qui fonctionnent bien chez les autres mais pas chez moi. ^^

Je récupère des données sauvegardées dans un fichier xml que je stocke dans des variables.
Le programme fonctionne, je récupère bien mes données mais j'ai systématiquement une levée d'exception au moment de l'instanciation du XmlSerializer et ceci AVANT même que je fasse un accès à mon fichier. Cette exception ne me déroute pas dans le catch et le programme continu "normalement" son job...

Même si ce n'est pas bloquant, j'aimerai bien corriger ce problème qui apparait dans ma fenêtre Sortie à chaque fois que je lance le programme. (Ne me dites pas de fermer la fenêtre avant de lancer ^^ )

Private Function LoadConfiguration() As Boolean

 Dim serialXML As Xml.Serialization.XmlSerializer 
 Dim Reader As StreamReader 
 Try

  ' C'est cette ligne qui déclenche l'exception :
  '  System.IO.FileNotFoundException dans mscorlib.dll
  serialXML = New Xml.Serialization.XmlSerializer(GetType(AppConfiguration))


  Reader = New StreamReader(Path.Combine(appData, "Config.xml"))
  Me.Config = CType(serialXML.Deserialize(Reader), AppConfiguration)
  Reader.Close()

 Catch ex As Exception
  LogTrace.WriteLine("#" + GetCurrentMethod().Name + " : " + ex.Message)
  Return False
 End Try
 Reader = Nothing
 serialXML = Nothing
 TxbCfgPosXChargement.Text = Config.PlateauChargement.ToString
 TxbCfgPosXEchantillon.Text = Config.PlateauEchantillon.ToString
 ' . . . 
End Sub 


Ma classe AppConfiguration est définie comme ceci :

<Serializable>
Public Class AppConfiguration
 ''' <summary>Coordonnée en X du plateau en position de chargement. L'unité est en mm.</summary>
 Public PlateauChargement As Double
 ''' <summary>Coordonnée en X du plateau pour prendre l'échantillon. L'unité est en mm.</summary>
 Public PlateauEchantillon As Double
 ''' <summary>Coordonnée en Z du plateau pour faire tremper le tampon dans l'échantillon. L'unité est en mm.</summary>
 Public AltitudeEchantillon As Double
 ''' <summary>Coordonnée en X du plateau pour prendre le tampon. L'unité est en mm.</summary>
 Public PlateauTampon As Double
 ' . . . . 
End Class

J'ai vérifié ce que renvoi le GetType. Tout me parait correct.
Dans les options avancées de compilation, "Générer des assemblys de sérialisation", J'ai essayé toutes les cas...


Merci d'avance à ceux qui voudront bien se pencher sur ce sujet. :)

6 réponses

Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
24 mai 2019 à 16:05
Haaa, c'est la dll qui plante, pas ton programme.
Pas de soucis, elle a sa gestion d'erreur, qui effectivement t'affiche un file not found dans la sortie, mais elle continue et fais son job. Donc sa gestion d'erreur est bien faite ;)
1
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 16:09
Ouf ! Ca me rassure, donc pour ce genre d'erreur, il faut fermer les yeux ?
Dans un sens cela m'arrange de ne pas partir dans le catch. :p
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
24 mai 2019 à 16:18
Elle fait exactement la même chose que toi, elle affiche dans la console un truc qui ne va pas.
De là à savoir quoi...
Ça peut être n'importe quoi, par exemple, une dll C++ native peut-être appelée, en général ces dll ont de multiples dépendances, dont certaines ne servent que dans un cas très précis, qui n'est pas le tiens, donc pour toi si la dépendance n'est pas là ça ne change rien, mais la dll remonte quand même qu'elle n'a pas trouvé cette dépendance.

Ça n'entrave pas la bonne marche de ton programme alors on fait avec.
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
24 mai 2019 à 13:29
Bonjour,

y'a bien longtemps que je n'ai pas utilisé XmlSerializer (je préfère Linq), mais il me semble bien que dans la classe il faut décrire quelle propriété est un élément, un attribut, pas sérialisé etc...
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 13:57
Dans cette classe, il n'y a que des variables publiques de type standard (double, integer, string) et rien d'autre.

C'est plus simple d'utiliser LINQ dans un cas comme celui-là ?
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
24 mai 2019 à 14:28
Dans cette classe, il n'y a que des variables publiques de type standard (double, integer, string) et rien d'autre.

Oui j'ai bien vu, et j'ai vérifié entre temps que si rien n'est spécifié alors à priori ça prend chaque propriété comme étant un élément.

Là comme ça je ne sais pas, ce code marche-t-il avec une autre classe?


Quand à Linq, ça n'est pas plus simple en soit, c'est différent et ça correspond plus à mon mode de pensée.
https://codes-sources.commentcamarche.net/faq/11196-linq-to-xml-c-et-vb-net
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 14:51
J'ai le même phénomène avec d'autres classes. (j'ai 3 classes pour lesquelles j'applique le même code)

Le pire c'est que ce code fonctionne !

Mais je me dis que ces exceptions ne viennent pas là par hasard et je n'aime pas laisser trainer des messages d'erreurs de ce genre.
Un programme qui "marchouille" plantera dans 3 mois à la prochaine mise à jour...
0

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

Posez votre question
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 15:53
J'ai commencé à regarder vers LINQ que je ne connais absolument pas....

Je ne peux pas trop me baser sur le lien que tu as mis, sauf si je déclare un constructeur dans ma classe.

Donc pour l'instant j'en suis là…

Private Function DeserialConfig() As AppConfiguration
        Dim xEle As XElement = XElement.Load(Path.Combine(appData, "Config.xml"))
        Dim Params As IEnumerable(Of XElement) = xEle.Elements 
        Dim result As New AppConfiguration

        For Each Param As XElement In Params
            Debug.WriteLine(Param.Name.ToString + " = " + Param.Value)
            Select Case Param.Name.ToString
                Case "PlateauChargement"
                    ' Affectation de la variable en tenant compte de son type et de la culture (caractère décimal)
                Case "..."

            End Select
        Next
        return result
End Function



Dans ma boucle for à part faire un gros select case avec le nom des paramètres, je ne vois pas pour l'instant comment remplir mon objet result.

il va me rester à traiter les tableaux également : dans ma classe j'ai un tableau de 4 doubles et je ne vois pas pour l'instant la manière dont il faut traiter ce cas.

Bref, cela m'a l'air un peu lourd comme procédé… il doit certainement y avoir un autre moyen de faire. :p

Je crois que je n'ai pas fini de chercher. ;)
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
Modifié le 24 mai 2019 à 15:54
Ce que je ne comprends pas c'est que tu dis que ça marche, ce qui voudrait dire que l'erreur n'apparait pas à la ligne que tu penses
Regarde
Try
   dim toto as int32 = 1 / 0'oh erreur on va direct dans le catch
   dint tutu  as string = "Ce code n'est pas exécuté s'il y a une erreur avant"
 Catch ex As Exception
  LogTrace.WriteLine("#" + GetCurrentMethod().Name + " : " + ex.Message)
  Return False
 End Try


As tu mis un point d'arrêt et exécuté en pas à pas pour voir?
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 15:56
Oui je suis d'accord avec toi.
C'est cela que je ne comprend pas. Quand je suis en pas à pas, je vois apparaitre le message d'exception mais mon code continu a se dérouler comme si cette exception était ignorée. Je ne part pas dans le catch
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 15:56
Le message apparait uniquement dans la fenetre de sortie
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
Modifié le 24 mai 2019 à 16:01
J'appuis sur F10, et pas de catch...
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
24 mai 2019 à 16:18
MERCI ! :)
0