SERIALISATION = CLONAGE ? [Résolu]

Signaler
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
-
Messages postés
14694
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 août 2020
-
Bonjour a tous,
Ma question concerne le clonage de Class.
(La mienne s'appele Mesh)

Dim A as new Mesh
......
Dim B as new Mesh
B = A

=> A et B sont identiques et surtout il ont le même emplacement en mémoire, ce qui est idéal pour l'optimisation mais incompatible dès que l'on veut dissocier des modifications sur une seule class.

1, Il faut pour cloner, définir toutes les classes a cloner en Sérializable ... (ainsi que toutes les sous classes dépendantes)

Public Class Mesh
.....
devient alors

<Serializable()> _
Public Class Mesh
.....

2, Ensuite il faut introduire la fonction suivante dans l'appli:
(de préférence dans un module)

'******************************************
'Fonction permettant le clonage d'objets serialisables
'******************************************
Public Shared Function clone(ByVal objet As Object) As Object
Dim mem As New System.IO.MemoryStream()
Dim binFormat As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
'Sérialisation de l'objet dans le flux-mémoire
binFormat.Serialize(mem, objet)
'On se repositionne au début du flux-mémoire
mem.Seek(0, System.IO.SeekOrigin.Begin)
clone = binFormat.Deserialize(mem)
End Function

Solution : B = clone(A)

Pour l'instant cela fonctionne mais les performances ne sont pas au rendez vous ...
La fonction suivante introduite dans la class est tres largement plus rapide: 0,01 sec contre 37.67 sec ( Class objet de 2.21 mo)... ou est l'erreur ...

Public Function cloner() As Mesh
Mesh.Propriétée1 = me.Propriétée1
Mesh.Propriétée2 = me.Propriétée2
Mesh.Propriétée3 = me.Propriétée3
....
End function

Quelqu'un a t'il une meilleure manière de cloner une class ou n'ai je rien compris a ce problème ?
Merci d'avance CGSI3

5 réponses

Messages postés
14694
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 août 2020
144
Bonjour,

Cette source semble répondre à tes besoin :
http://www.vbfrance.com/codes/CLONER-OBJET-TRES-SIMPLEMENT_29859.aspx

ça semble la seule solution simple.

Mon site
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Merci Henry pour le lien,

Cette solution semble quasiment identique a ce que j'utilise.

Dois je donc me résoudre a cette affirmation :

La sérialisation n'est pas aussi rapide qu'on pourrais l'imaginer,
et n'est pas la meilleure au clonage.

Je suis assez perplex.
Cependant un dernier point reste a confirmer:
J'ai un Dictionary dans cette class, je verifie tout de suite si ce point réduit la vitesse du clonage.
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
J'ai déja une première réponse,
Si je réduit ma classe a une seule propriétée qui est la suivante

Private Tablo_Integer() As Integer
( Il ne me reste alors qu'1/5 de la taille de ma classe de base )

Si je clone l'ensemble, je tombe a 6 ms,
Les formats de données sont donc la seule explication a ce pb de clonage.
Ils réduisent de façon considérable la rapidité de l'ensemble.
De plus si l'on doit dupliquer un tableau, un bon vieux "=" est suffisantet un tout petit peu + rapide (5 ms)
Bonne prog CGSI3
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Oups erreur
Sur le même principe on ne fait pas "=" pour cloner un tableau mais on utilise la fonction clone d'un array

Private _Propriétée1() as Integer
Private _Propriétée2 as Integer
....

Public Function cloner() As Mesh
Mesh.Propriétée1 = _Propriétée1.clone
Mesh.Propriétée2 = _Propriétée2
....
End function


Ceci change completement mon benchmark mais fonctionne.
120 ms pour cloner la class complete contre 37 sec pour la serialisation.
Bonne prog CGSI3
Messages postés
14694
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 août 2020
144
Bonjour,

Merci pour ces précieuses mesures et informations, ça sert toujours :)

Mon site