2012-01-19 12 views
6

Ho trovato numerose soluzioni qui in SO e in elsewere che trattano di cloni di oggetti profondi tramite serializzazione/deserializzazione (in memoria e ritorno).Clonazione di oggetti senza serializzazione

Richiede che le classi da clonare siano contrassegnate con [Serializable]. Mi capita di avere le mie classi (ben la maggior parte di loro) contrassegnate con [DataContract] perché uso DataContractSerializer per serializzare in XML.

Ho introdotto solo l'attributo [Serializable] a causa della necessità di clonare in profondità alcune di queste istanze di classe. Tuttavia, ora qualcosa è accaduto alla serializzazione/deserializzazione tramite DCS perché non funziona più - errori riguardo l'aspettativa di un diverso elemento XML sulla deserializzazione. Se rimuovo lo [Serializable], gli errori sono spariti.

Quali sono le mie opzioni? Voglio solo clonare in profondità i miei oggetti il ​​più semplice possibile.

+0

È possibile utilizzare la riflessione, ma ciò potrebbe comportare anche un leggero sovraccarico delle prestazioni. – IDWMaster

+0

Perché hai bisogno di [Serializable] qui? Potresti usare DCS per il clone profondo ...? Basta serializzarlo su un MemoryStream tramite DCS ...? –

+0

sì, mi sono appena inventato qualcosa, lo posterò – mare

risposta

9

Questo funziona

public static T DeepClone<T>(this T a) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(T)); 
      dcs.WriteObject(stream, a); 
      stream.Position = 0; 
      return (T)dcs.ReadObject(stream); 
     } 
    } 
1

serializzazione JSON e deserializzazione dovrebbe funzionare, non richiede alle classi di avere serialize annotazione.

public static T DeepCopy<T>(this T source) 
{ 
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source)); 
}