Serializer plusieurs collections d'objets dans un seul fichier binaire [Résolu]

Signaler
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013
-
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
-
Bonsoir à tous,
J'ai plusieurs collections instanciés à partir de classes serializables, chaque collections d'objets peut être serializer et dézerialiser individuellement sans problèmes.... J'aimerais savoir si je peux serializer tous ces objets simplement dans un seul fichier et bien sûre pouvoir aussi deserializer à partir de ce même fichier.

Par exemple j'ai une collection d'objet "Personnes" instanciée de cette facon :
Public personnes As New SortedList(Of String, Personne)
et une collection d'objets "Voitures" instanciée de cette facon :
Public personnes As New SortedList(Of String, Personne)

Et voici mes classes correspondantes :
[i]<Serializable()> Public Class Personne
....
End Class

<Serializable()> Public Class Voiture
....
End Class/i

Merci beaucoup si vous pouvez m'aider...

8 réponses

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

Lorsque j'ai ce genre de chose à faire, je trouve que le plus simple est de créer une classe (sérailizable aussi) qui englobe ou contient les listes.

Par exemple :
<Serializable()> _
Public Class MesListes
   Private _voitures as SortedList(Of String, Voiture)
   Private _personnes as SortedList(Of String, Personne)

   Public ReadOnly Property Voitures() as SortedList(Of String, Voiture)
      Get
         Return _voitures
      End Get
   End Property

   Public ReadOnly Property Personnes() as SortedList(Of String, Personne)
      Get
         Return _personnes
      End Get
   End Property

   Public Sub New(ByVal voitures as SortedList(Of String, Voiture), _
       ByVal personnes as SortedList(Of String, Personne))
      _voitures = voitures
      _personnes = personnes
   End Sub
End Class


Comme ca il suffit de sérialiser la classe MesListes
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Vous avez plusieurs possiblitiés.

1) Créer les instances de liste à l'avance et l'instance de MesListes juste avant la sérialization
Dim mesVoitures As New SortedList(String, Voiture)
Dim mesPersonnes As New SortedList(Of String, Personne)

mesVoitures.Add("R19", New Voiture(...))
mesPersonnes.Add("Olivier", New Personne(...))

'Besoin de sérialiser les listes
Dim mesListes As New MesListes(mesVoitures, mesPersonnes)

'Sérialisation de l'objet mesListes ...


2) Créer les instances des listes en même temps que l'instance de l'objet MesListe et travailler avec l'objet MesListes
Dim mesListes as New MesListes(New SortedList(Of String, Voiture), New SortedList(Of String, Personne))

mesListes.Voitures.Add("R19", New Voiture(...))
mesListes.Personnes.Add("Olivier", New Personne(...))

'Sérialisation de l'objet mesListes ...


3) Travailler uniquement avec l'objet MesListes en ajoutant le constructeur ci-dessous pour faciliter la création
Public Sub New() 
    _voitures = New SortedList(Of String, Voiture)
    _personnes = New SortedList(Of String, Personne)
End Sub


Dans ce cas l'utilisation sera
Dim mesListes as New MesListes()

mesListes.Voitures.Add("R19", New Voiture(...))
mesListes.Personnes.Add("Olivier", New Personne(...))

'Sérialisation de l'objet mesListes ...
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Attention mesListes n'est pas une SortedList(Of String, MesListes), sont type est MesListes. Donc pour déserialiser il faut faire :
meslistes = TryCast(formatter.Deserialize(fs), MesListes)
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013

Zut j'ai fait une faute de frappe, merci de corriger :
Public Voitures As New SortedList(Of String, Voiture)
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013

Merci beaucoup Foliv57 pour votre réponse. Si j'ai bien compris je ne doit plus instancier 'Personnes' et 'Voitures' individuellement mais je doit instancier 'MesListes' qui englobera mes objets 'Personnes' et 'Voitures' ? Du style MesListes.Personnes et MesListes.voitures ?
J'essairais cela et je vous tiens au courant....
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013

Merci beaucoup pour votre réponse foliv57, la 1ere solution me semble la plus appropriée. J'essaye cela dés que possible et je vous tiens au courant.
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013

Re Foliv57, j'ai bien serializer meslistes mais je n'arrive pas à désieralizer, l'instruction suivante ne marche pas :
meslistes = TryCast(formatter.Deserialize(fs), SortedList(Of String, MesListes))

Dois-je deserializer tous mes objets individuellement (personnes, voitures) ou l'ensemble de meslistes ?

Merci beaucoup si vous pouvez m'aider.
Messages postés
140
Date d'inscription
samedi 5 mars 2011
Statut
Membre
Dernière intervention
13 août 2013

Oups, j'ai trouvé mon erreur :

meslistes = TryCast(formatter.Deserialize(fs), MesListes)

Personnes = meslistes.Personnes
Voitures = meslistes.Voitures

Merci beaucoup Foliv57 pour votre aide trés précieuse et ce bout de code qui me rend un immense service.