begin process at 2012 02 11 22:26:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VB.NET

 > CLONER UN OBJET TRÈS SIMPLEMENT

CLONER UN OBJET TRÈS SIMPLEMENT


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :VB.NET Source .NET ( DotNet ) Niveau :Initié Date de création :01/03/2005 Vu :17 605

Auteur : NicolasLight

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

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

  • '************
  • '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
'************
'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.)


 Sources du même auteur

Source avec Zip Source .NET (Dotnet) SURVEILLANCE DES MODIFICATIONS APPORTÉE SUR N'IMPORTE QUEL T...
Source avec Zip Source .NET (Dotnet) GROUPE DE RADIOBOUTONS ET DATABINDING
Source .NET (Dotnet) CLASSE PERMETTANT LA COPIE RÉCURSIVE ET LA VERIFICATION DE L...
Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSES DANS UNE DLL PERMETTANT L'ÉCRITURE ET LA LECTURE D'O...

 Sources de la même categorie

Source .NET (Dotnet) MODIFICATION DATE DE WINDOWS EN VB.NET ET VBA par us_30
Source avec Zip Source avec une capture Source .NET (Dotnet) ENVOI DE MAIL AVEC PIÈCE JOINTE par EhJoe
Source .NET (Dotnet) AMUSONS NOUS AVEC UN LABEL ^^ par Adn56
Source avec Zip Source avec une capture Source .NET (Dotnet) UN NAVIGATEUR INTERNET EN VB.NET par azrti
Source avec Zip Source .NET (Dotnet) CONVERSION DE DEVISE MONAITAIRE VIA UN SERVICE WEB par bigmonkey7

Commentaires et avis

Commentaire de chris81 le 02/03/2005 00:47:45

slt,
que veux dire serialise et deserialise?
merci

Commentaire de ofeelfree le 02/03/2005 10:35:18

Bonjour,

On pourrait aussi imaginer :

Public Class Personne

   Implements ICloneable

   Public mNom As String
   Public mPrenom As String

   Public Sub New(Nom As String, Prenom As String)
      mNom = Nom
      mPrenom = Prenom
   End Sub

   Public Function Clone() As Personne Implements ICloneable.Clone
      Return New Personne(mNom, mPrenom)
   End Function

End Class

Ainsi on peut se passer de la sérialisation et implémenter l'interface par défaut qui va bien...

Commentaire de TheSaib le 02/03/2005 11:41:54 administrateur CS

C'est une astuce intérressante. Cependant ya des techniques un plus objets :)

http://www.codeproject.com/csharp/cloneimpl_class.asp

Commentaire de NicolasLight le 02/03/2005 17:04:18

Avant tout, merci de vos commentaires.

Pour répondre à Chris81,

Sérialisez signifie en gros :
transformer un objet en données que l'on pourra écrire sur un flux. On utilise alors un formateur (ex : le binaryFormatter) pour transformer cet objet en binaire par exemple, donc en un tableau de bytes, ou en xml avec le xmlSerializer.
Cette manipulation permet ainsi d'écrire un objet sur n'importe quel flux (Stream).

La désérialisation est le procédé inverse de la sérialisation : on retransforme les données d'un flux (Stream) en un objet du type de départ (dans mon exemple, on retransforme en un objet Personne).

J'espère avoir répondu à ta réponse.

Commentaire de chris81 le 02/03/2005 22:18:46

merci pour tes explications claires 8/10

Commentaire de JoePatent le 04/03/2005 20:22:07

Existe-t-il la meme astuce pour les classes en  VB6 ?

Commentaire de NicolasLight le 05/03/2005 20:53:24

Je suis désolé, je n'ai pas beaucoup travaillé en VB6, j'ai surtout travaillé en JAVA et en VB.NET.
Mais si je trouve une réponse à ta question, je la posterai ici ;-)

Commentaire de Pitchou13 le 08/03/2005 10:55:24

Je crois que sur VBA il y avait une fonction pour ca ! et Avec les réferences, je clonait un objet en une ligne sous VB6... Je vais essayer de la retrouver ...
@+

Commentaire de LATE le 07/11/2005 17:14:49

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 ..;

Commentaire de NicolasLight le 13/11/2005 10:45:53

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.

Commentaire de GW74372 le 27/07/2009 16:53:01

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!

Commentaire de CGSI3 le 24/04/2011 23:12:45

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

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales