2012-01-19 2 views
6

Я нашел множество решений здесь, в SO и elsewere, которые касаются глубокого клонирования объекта посредством сериализации/десериализации (в память и обратно).Клонирование объектов без сериализации

Это требует, чтобы классы, которые нужно клонировать, помечены [Serializable]. У меня есть мои классы (и большинство из них), отмеченные [DataContract], потому что я использую DataContractSerializer для сериализации в XML.

Я ввел только атрибут [Serializable] из-за необходимости глубокого клонирования некоторых из этих экземпляров класса. Однако теперь что-то случилось с сериализацией/десериализацией через DCS, потому что оно больше не работает - ошибки в ожидании использования другого элемента XML при десериализации. Если я удалю [Serializable], ошибки исчезнут.

Какие у меня варианты? Я просто хочу глубоко клонировать мои объекты как можно проще.

+0

Вы можете использовать рефлексию, но это может также привести к незначительным служебным накладным расходам. – IDWMaster

+0

Зачем вам [Serializable] здесь вообще? Вы можете использовать DCS для глубокого клонирования ...? Просто сериализуйте его в MemoryStream через DCS ...? –

+0

да я просто что-то придумал, я отправлю его – mare

ответ

9

Это работает

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 сериализации и десериализации должен работать, он не требует классов иметь сериализации аннотацию.

public static T DeepCopy<T>(this T source) 
{ 
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source)); 
} 
Смежные вопросы