Sérialisation de structure contenant une classe

Résolu
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016 - 15 mars 2013 à 15:59
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016 - 18 mars 2013 à 14:27
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

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
18 mars 2013 à 14:02
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
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
15 mars 2013 à 19:14
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
0
cs_got Messages postés 139 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 15 mars 2016
18 mars 2013 à 14:27
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.
0
Rejoignez-nous