c# - Objets de clonage profond

Mots clés : c#.netclonec#

meilleur 3 Réponses c# - Objets de clonage profond

vote vote

96

using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary;  /// <summary> /// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx /// Provides a method for performing a deep copy of an object. /// Binary Serialization is used to perform the copy. /// </summary> public static class ObjectCopier {     /// <summary>     /// Perform a deep copy of the object via serialization.     /// </summary>     /// <typeparam name="T">The type of object being copied.</typeparam>     /// <param name="source">The object instance to copy.</param>     /// <returns>A deep copy of the object.</returns>     public static T Clone<T>(T source)     {         if (!typeof(T).IsSerializable)         {             throw new ArgumentException("The type must be serializable.", nameof(source));         }          // Don't serialize a null object, simply return the default for that object         if (ReferenceEquals(source, null)) return default;          using var Stream stream = new MemoryStream();         IFormatter formatter = new BinaryFormatter();         formatter.Serialize(stream, source);         stream.Seek(0, SeekOrigin.Begin);         return (T)formatter.Deserialize(stream);     } } 
public static T Clone<T>(this T source) {    // ... } 
/// <summary> /// Perform a deep Copy of the object, using Json as a serialization method. NOTE: Private members are not cloned using this method. /// </summary> /// <typeparam name="T">The type of object being copied.</typeparam> /// <param name="source">The object instance to copy.</param> /// <returns>The copied object.</returns> public static T CloneJson<T>(this T source) {                 // Don't serialize a null object, simply return the default for that object     if (ReferenceEquals(source, null)) return default;      // initialize inner objects individually     // for example in default constructor some list property initialized with some values,     // but in 'source' these items are cleaned -     // without ObjectCreationHandling.Replace default constructor values will be added to result     var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};      return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings); } 
vote vote

84

public static T Clone<T>(T source) {     var serialized = JsonConvert.SerializeObject(source);     return JsonConvert.DeserializeObject<T>(serialized); } 
public static class SystemExtension {     public static T Clone<T>(this T source)     {         var serialized = JsonConvert.SerializeObject(source);         return JsonConvert.DeserializeObject<T>(serialized);     } } 
vote vote

78

public class Person : ICloneable {     private final Brain brain; // brain is final since I do not want                  // any transplant on it once created!     private int age;     public Person(Brain aBrain, int theAge)     {         brain = aBrain;          age = theAge;     }     protected Person(Person another)     {         Brain refBrain = null;         try         {             refBrain = (Brain) another.brain.clone();             // You can set the brain in the constructor         }         catch(CloneNotSupportedException e) {}         brain = refBrain;         age = another.age;     }     public String toString()     {         return "This is person with " + brain;         // Not meant to sound rude as it reads!     }     public Object clone()     {         return new Person(this);     }     … } 
public class SkilledPerson extends Person {     private String theSkills;     public SkilledPerson(Brain aBrain, int theAge, String skills)     {         super(aBrain, theAge);         theSkills = skills;     }     protected SkilledPerson(SkilledPerson another)     {         super(another);         theSkills = another.theSkills;     }      public Object clone()     {         return new SkilledPerson(this);     }     public String toString()     {         return "SkilledPerson: " + super.toString();     } } 
public class User {     public static void play(Person p)     {         Person another = (Person) p.clone();         System.out.println(p);         System.out.println(another);     }     public static void main(String[] args)     {         Person sam = new Person(new Brain(), 1);         play(sam);         SkilledPerson bob = new SkilledPerson(new SmarterBrain(), 1, "Writer");         play(bob);     } } 
This is person with Brain@1fcc69 This is person with Brain@253498 SkilledPerson: This is person with SmarterBrain@1fef6f SkilledPerson: This is person with SmarterBrain@209f4e 

Questions similaires