2012-01-19 15 views
6

Znalazłem wiele rozwiązań tutaj w SO, a ponadto zajmowałem się głębokim klonowaniem obiektu poprzez szeregowanie/deserializację (do pamięci iz powrotem).Klonowanie obiektów bez szeregowania

Wymaga, aby klasy, które mają zostać sklonowane, zostały oznaczone jako [Serializable]. Zdarza mi się, że moje klasy (a także większość z nich) są oznaczone [DataContract], ponieważ używam DataContractSerializer do serializowania do XML.

Wprowadziłem tylko atrybut [Serializable], ponieważ potrzebuję głębokiego sklonowania niektórych z tych wystąpień klas. Jednak teraz coś stało się z serializacją/deserializacją za pośrednictwem DCS, ponieważ już nie działa - błędy związane z oczekiwaniem innego elementu XML na deserializację. Jeśli usuniemy [Serializable], błędy znikną.

Jakie są moje opcje? Po prostu chcę sklonować moje obiekty tak prosto, jak to tylko możliwe.

+0

Można użyć odbicia, ale może to również spowodować niewielki wzrost wydajności. – IDWMaster

+0

Dlaczego w ogóle potrzebujesz tutaj Serializable? Możesz użyć DCS dla głębokiego klonu ...? Po prostu serializować go do MemoryStream przez DCS ...? –

+0

tak, właśnie wymyśliłem coś, opublikuję – mare

Odpowiedz

9

Działa

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 serializacji i deserializacji powinny działać, ponieważ nie wymaga zajęcia mieć serialize adnotacji.

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