Sérialisation de structure contenant une classe [Résolu]

Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Dernière intervention
15 mars 2016
- - Dernière réponse : cs_got
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
7
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 117 internautes nous ont dit merci ce mois-ci

Commenter la réponse de foliv57
Messages postés
14383
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
10 février 2019
153
0
Merci
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
Commenter la réponse de NHenry
Messages postés
139
Date d'inscription
lundi 7 janvier 2002
Dernière intervention
15 mars 2016
0
Merci
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.
Commenter la réponse de cs_got

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.