Cloner un objet très simplement

Soyez le premier à donner votre avis sur cette source.

Snippet vu 22 685 fois - Téléchargée 36 fois

Contenu du snippet

Etant donné que je travaillé en JAVA avant, j'avais l'abitude de cloner simplement les objets avec leur fonction "clone". Ca m'a fait un drôle d'effet de voir qu'en .net, cette fonction ne marchait pas.
J'ai donc trouvé une méthode simple et rapide de cloner un objet car ATTENTION :
si a est un objet et qu'on fait b = a, b n'est pas une copie de a mais simplement un "pointeur" vers a. C'est-à-dire que toute modification de a se voit dans b.
Pour faire une copie d'un objet dans un autre, j'ai donc écrit une petite fonction qui sérialise en mémoire l'objet à cloner et qui le le désérialise ensuite dans un nouvel objet. Le nouvel objet est donc le clone du premier.

ATTENTION : la classe de l'objet à cloner doit absolument être précédée de l'attribut <Serializable> !!!

Source / Exemple :


'************
'Objet à cloner
'************
<Serializable> _
Class personne
    public nom as string
    public prenom as string

    public sub New(byval nom as string, byval prenom as string)
        Me.nom = nom
        Me.prenom = prenom
    End sub
End Class

'******************************************
'Fonction permettant le clonage d'objets sérialisables
'******************************************
Public Class CloneObject
	'Fonction de clonage d'objets sérialisables
	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)

		'Désérialisation de l'objet depuis le flux-mémoire vers l'objet renvoyé par la fonction
		clone = binFormat.Deserialize(mem)
	End Function
End Class

Conclusion :


Tout est dit dans la présentation.
N'oubliez pas que les classes des objets à cloner doivent être précédés de <Serializable> _

Remarque : la fonction de clonage de cette classe est "Shared" ce qui permet de l'utiliser directement sans
devoir déclarer un objet de type "CloneObject".

J'espère que cette classe vous sera utile. N'hésitez pas à me donner vos fonctions de clonage si vous en connaissez de meilleurs (ex : IClonable, etc.)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
43
Date d'inscription
vendredi 22 décembre 2000
Statut
Membre
Dernière intervention
12 décembre 2017

Bonjour ce post commence a daté mais j'ai un souci avec cette copie d'objet. Mon souci poste sur la copie d'objet graphique.
Dans le cadre d'une évolution d'un code VB6 vers VB.net
Sur ma form j'ai 120 fois un groupBox contenant plusieurs picturebox (6) et plusieurs textbox (4).

Au lieu de les dessiner un par un comme on faisait dans VB6 à l'aide des index formant des tableau. J'aimerais en dessiner un puis le recopier 120 fois en les affectant dans des tableau de Picturebox et textbox et groupebox ainsi je garde tout mon code d'algo de VB6 pour aller modifier les objets.

Est-ce possible avec la sérialisation.
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Bonjour,
je vous joint juste ce lien pour vous montrer, que même si elle fonctionne, il y a des pb de velocité dans cette méthode
http://www.vbfrance.com/forum/sujet-SERIALISATION-CLONAGE_1515175.aspx
Bonne prog CGSI3
Messages postés
6
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
31 mars 2010

Bonjour,
Je voudrais répondre à LATE sur sa classe qui ne se clone pas.
En fait, commele précisait NICOLASLIGHT la classe doit être <sérialiable>_ mais aussi les objets qui la compose. Et malheureusement Collection ne l'est pas!!
Pour que cela marche il faudrait que tu fasse une collection typé qui herite de ISerializable
Voila!
Messages postés
5
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
18 novembre 2005

Salut LATE, dans ton cas, le plus simple est d'implémenter la fonction Clone de l'interface ICloneable comme le décrit ofeelfree. De toute manière, avec du recul, je me suis rendu compte que ma méthode n'était pas très rapide à l'exécution mais a l'avantage de pouvoir cloner n'importe quoi facilement sans devoir écrire cette fonction clone.
Cependant, ça m'étonne que ça ne marche pas sur ta classe. N'oublies pas de mettre <serializable>_ devant la déclaration de la classe.
Messages postés
2
Date d'inscription
lundi 6 janvier 2003
Statut
Membre
Dernière intervention
7 novembre 2005

Sympa.... mais pas de récursivité...
si quelqu'un trouve avant moi ..
en clair si ma classe :

# Class personne
# public nom as string
# public prenom as string
public colVoiture as collection
#
# public sub New(byval nom as string, byval prenom as string)
# Me.nom = nom
# Me.prenom = prenom
Me.colVoiture = new collection
Me.colVoiture.add (1, "Fiat")
Me.colVoiture.add (2, "Renault")
# End sub
# End Class
#

dans ce cas... ca marche pas..
merci pour celui qui trouve avant moi ..;
Afficher les 13 commentaires

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.