Sérialisation de structure contenant une classe

[Résolu]
Signaler
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016
-
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016
-
Bonjour

je déclare une structure que je veux sérialiser :

 <Serializable()>
    Public Structure App_Param

        Public Type_File As Byte
        Public Separ_Dec As String
        Public Separ_File As String
        Public Tps_Echantill As ULong
        Public Extension As String
        Public State_Stop_Acq_Auto As Boolean
        Public Time_Stop_Acq_Auto As ULong
        Public Langage As CultureInfo

    End Structure


quand je veux sérialiser tout ça je fait :

 Dim XS As New XmlSerializer(GetType(App_Param))


plus du code derrière. Mais rien que cette déclaration me plante avec :
" Une erreur s'est produite lors de la réflexion du type"

Si je ne met pas le cultureInfo cela fonctionne ...

En recherche sur le net je trouve des pistes où l'on parle de surcharge de constructeur.

Une idée ?


Merci

3 réponses

Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
8
Bonjour,

Votre problème vient du fait que pour pouvoir sérializer un objet en XML, celui-ci doit obligatoirement disposer d’un constructeur sans paramètres. Ce qui n’est pas le cas de la classe CultureInfo.

Donc cette classe ne peut pas être directement sérialisée en XML.

Il va donc falloir regarder du coté de la customisation. Ci-dessous un petit exemple qu'il faudra peut-être adapter. (Le module est la juste à titre d'exemple)

Module Module1

    Sub Main()
        Dim XS As New XmlSerializer(GetType(App_Param))
        Dim a As New App_Param
        a.Type_File = 10
        a.Separ_Dec = ","
        a.Separ_File = "."
        a.Tps_Echantill = 10
        a.Extension = ".tit"
        a.State_Stop_Acq_Auto = True
        a.Time_Stop_Acq_Auto = 10
        a.Langage = New CultureInfo("fr-FR")

        Using fs As New FileStream("C:\myXMLSerializedFile.xml", FileMode.Create, FileAccess.Write)
            XS.Serialize(fs, a)
        End Using

        Dim b As App_Param
        Using fs As New FileStream("C:\myXMLSerializedFile.xml", FileMode.Open, FileAccess.Read)
            b = CType(XS.Deserialize(fs), App_Param)
        End Using

        Console.WriteLine(b.Type_File.ToString())
        Console.WriteLine(b.Separ_Dec)
        Console.WriteLine(b.Separ_File)
        Console.WriteLine(b.Tps_Echantill.ToString())
        Console.WriteLine(b.Extension)
        Console.WriteLine(b.State_Stop_Acq_Auto.ToString())
        Console.WriteLine(b.Time_Stop_Acq_Auto.ToString())
        Console.WriteLine(b.Langage.ToString())

        Console.Read()
    End Sub

End Module

<Serializable()>
Public Structure App_Param
    Implements IXmlSerializable

    Public Type_File As Byte
    Public Separ_Dec As String
    Public Separ_File As String
    Public Tps_Echantill As ULong
    Public Extension As String
    Public State_Stop_Acq_Auto As Boolean
    Public Time_Stop_Acq_Auto As ULong

    'L'attribut permet de ne pas prendre en compte la propriété
    <XmlIgnore()> _
    Public Langage As CultureInfo

    Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
        Return Nothing
    End Function

    'Déserialisation
    Public Sub ReadXml(reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
        'Ici on re-lit le fichier XML
        reader.Read()
        reader.ReadStartElement("TypeFile")
        Type_File = Byte.Parse(reader.ReadContentAsString)
        reader.ReadEndElement()
        reader.ReadStartElement("SeparDec")
        Separ_Dec = reader.ReadContentAsString
        reader.ReadEndElement()
        reader.ReadStartElement("SeparFile")
        Separ_File = reader.ReadContentAsString
        reader.ReadEndElement()
        reader.ReadStartElement("TpsEchantill")
        Tps_Echantill = ULong.Parse(reader.ReadContentAsString)
        reader.ReadEndElement()
        reader.ReadStartElement("Extension")
        Extension = reader.ReadContentAsString
        reader.ReadEndElement()
        reader.ReadStartElement("StateStopAcqAuto")
        State_Stop_Acq_Auto = Boolean.Parse(reader.ReadContentAsString)
        reader.ReadEndElement()
        reader.ReadStartElement("TimeStopAcqAuto")
        Time_Stop_Acq_Auto = ULong.Parse(reader.ReadContentAsString)
        reader.ReadEndElement()
        reader.ReadStartElement("Langage")
        Langage = New CultureInfo(reader.ReadContentAsString)
        reader.ReadEndElement()
    End Sub

    'Serialisation
    Public Sub WriteXml(writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
        'Ici on cré le contenu du fichier XML
        writer.WriteElementString("TypeFile", Me.Type_File.ToString())
        writer.WriteElementString("SeparDec", Me.Separ_Dec)
        writer.WriteElementString("SeparFile", Me.Separ_File)
        writer.WriteElementString("TpsEchantill", Me.Tps_Echantill.ToString())
        writer.WriteElementString("Extension", Me.Extension)
        writer.WriteElementString("StateStopAcqAuto", Me.State_Stop_Acq_Auto.ToString())
        writer.WriteElementString("TimeStopAcqAuto", Me.Time_Stop_Acq_Auto.ToString())
        writer.WriteElementString("Langage", Me.Langage.ToString())
    End Sub

End Structure
Messages postés
14827
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 octobre 2021
157
Bonjour,

Il me semble que la sérialisation ne permet que de sérialiser les types de base.
Sinon, il me semble avoir lu qu'il y avait aussi des attributs à mettre pour la sérialisation XML.

v----Signature--------v----------------------------------------------
[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
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 mars 2016

Merci.

Bon au final je trouve plus simple de passer par une string à la place de mon culureinfo et de convertir après/avant sérialisation.