Comment faire le Soap d'une class sans Soap ?

Résolu
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 23 mars 2012 à 23:40
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 24 mars 2012 à 20:20
Chalut

Je ne sais pas si c'est normal... je n'ai pas de SoapFormatter dans mon Framework 4.

Je cherche donc a réaliser une serialisation avec Xmlserializer car mon objectif c'est de sauvegarder une class sur le disque et de la restaurer.

Dans mon projet je vais avoir plusieurs class a sauvegarder et donc je ne souhaite pas faire une fonction Serialize/Deserialize pour chaque class.

Voila la class a sauvegarder:
Namespace MainDocuments
    Public Class DefaultDirectory
        <System.Serializable()>
        Public Class Memory
            Private Shared mDirectory As String

            Shared Property Directory As String
                Get
                    Return mDirectory
                End Get
                Set(ByVal value As String)
                    mDirectory = value
                End Set
            End Property
        End Class
        Sub New()
            DefaultDirectory.Memory.Directory = Nothing
        End Sub
    End Class
End Namespace


Voici ma fonction pour sauvegarder:
        Public Sub SaveDefault(ByVal SourceClass As Type, ByVal DestinationFile As String)
            Dim fStream As New FileStream(DestinationFile, FileMode.Create)
            Dim mySoap As New Xml.Serialization.XmlSerializer(SourceClass)

            Try
                mySoap.Serialize(fStream, SourceClass)
            Catch ex As Exception
                MessageBox.Show(ex.ToString & Environment.NewLine & SourceClass.ToString & Environment.NewLine & DestinationFile, "SaveDefault", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                fStream.Close()
            End Try
        End Sub


Et enfin mon bouton:
    Private Sub But_DocumentsSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_DocumentsSave.Click
        MainPaths.Serialisation.SaveDefault(MainDocuments.DefaultDirectory.Memory, MainPaths.Application.SaveDocumentsFullPath)
    End Sub


Le code fonctionne pas.
Pour faire passer mes paramètres sur le bouton il demande un TYPE et non un objet.
XmlSerializer adore la chose puisqu'il lui faut un type.
Mon Serialize le prend même si il attend un objet.

Comment faire une fonction unique pour Serializer et Deserializer qui prend le nom d'une class en paramètre ?

Le top:
Public Sub SaveDefault(ByVal SourceClass As Class, ByVal DestinationFile As String)

et donc ^^
MainPaths.Serialisation.SaveDefault(MainDocuments.DefaultDirectory.Memory, MainPaths.Application.SaveDocumentsFullPath)

3 réponses

Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
24 mars 2012 à 12:02
Duke49 on ne peut pas serializer toutes les variables contenues dans une class.

Il faut que tu baragouine en prenant tes valeurs en utilisant une Hashtable !!!
Exemple:
    <System.Serializable()>
    Public Class DefaultDirectory
        Public Shared mDirectory As New Hashtable

        Sub New()
            DefaultDirectory.mDirectory.Add("mDirectory", Nothing)
        End Sub

        Protected Overrides Sub Finalize()
            mDirectory.Clear()
            MyBase.Finalize()
        End Sub
    End Class


Public Module Serialisation
        Public Sub SaveDefault(ByVal Sources As Hashtable, ByVal DestinationFile As String)
            Dim fStream As New FileStream(DestinationFile, FileMode.Create)
            Dim binFormat As New BinaryFormatter

            Try
                binFormat.Serialize(fStream, Sources)
            Catch ex As Exception
                MessageBox.Show(ex.ToString & Environment.NewLine & Environment.NewLine & DestinationClass.ToString & Environment.NewLine & SourceFile, "SaveDefault", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                fStream.Close()
            End Try
        End Sub

        Public Sub RestoreDefault(ByRef DestinationClass As Hashtable, ByVal SourceFile As String)
            Dim fStream As FileStream
            Dim binFormat As New BinaryFormatter

            If File.Exists(SourceFile) Then
                fStream = New FileStream(SourceFile, FileMode.Open)
                Try
                    DestinationClass = binFormat.Deserialize(fStream)
                Catch ex As Exception
                    MessageBox.Show(ex.ToString & Environment.NewLine & Environment.NewLine & DestinationClass.ToString & Environment.NewLine & SourceFile, "RestoreDefault", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Finally
                    fStream.Close()
                End Try
            End If
        End Sub
    End Module


    Private Sub But_DocumentsSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_DocumentsSave.Click
        Dim mDic As New Hashtable
        mDic = MainDocuments.DefaultDirectory.mDirectory
        MainPaths.Serialisation.SaveDefault(mDic, MainPaths.Application.SaveDocumentsFullPath)
        mDic.Clear()
    End Sub

    Private Sub But_DocumentsRestore_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_DocumentsRestore.Click
        Dim mDic As New Hashtable
        mDic = MainDocuments.DefaultDirectory.mDirectory
        MainPaths.Serialisation.RestoreDefault(mDic, MainPaths.Application.SaveDocumentsFullPath)
        Me.Txt_DocumentsDirectory.Text = mDic.Item("mDirectory")
        mDic.Clear()
    End Sub


Si quelqu'un a mieux qu'il ce manifeste ^^
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
24 mars 2012 à 19:46
Salut

Il y a deux duke
un qui pose les questions l'autre qui répond
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
24 mars 2012 à 20:20
Et oui ShayW, fidèle à moi même
0
Rejoignez-nous