2012-01-19 23 views
6

Burada SO'da çok sayıda çözüm buldum ve daha sonra seri hale getirme/serileştirme (belleğe ve arkana) aracılığıyla nesnenin derin klonu ile başa çıkmak.Serileştirme olmadan nesneleri klonlama

Klonlanacak sınıfların [Serializable] ile işaretlenmesi gerekir. Ben DataContractSerializer kullanıyorum çünkü [DataContract] ile işaretlenmiş sınıflarımı (çoğu) XML'ye serileştiririm.

Bu sınıf örneklerinden bazılarının derin klonu ihtiyacından dolayı yalnızca [Serializable] özniteliğini tanıttım. Bununla birlikte, artık artık bir işleyiş olmadığı için DCS üzerinden serileştirme/serileştirme işlemine bir şey oldu - seri hale getirme üzerinde farklı bir XML öğesini beklemeyle ilgili hatalar. [Serializable]'u kaldırırsam, hatalar gider.

Seçeneklerim nelerdir? Sadece nesnelerini mümkün olduğunca basit klonlamak istiyorum.

+0

Yansımayı kullanabilirsiniz, ancak bu, hafif bir performans yüküne de yol açabilir. – IDWMaster

+0

Neden [Seri hale getirilebilir] burada ihtiyacın var? DCS'yi derin klon için kullanabilirsin ...? Sadece DCS ile MemoryStream'e serileştirin ...? –

+0

evet sadece bir şey buldum, göndereceğim – mare

cevap

9

Bu

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

Json seri çalışıyor ve seri kaldırma o serialize ek açıklaması için sınıfları gerektirmez çalışmalıdır.

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