У нас есть приложение, которое выполняет сравнение объектов данных, чтобы определить, отличается ли одна версия объекта другой. Наше приложение также делает некоторое обширное кэширование этих объектов, и мы столкнулись с проблемой производительности, когда дело доходит до выполнения этих сравнений.Эффективное клонирование кешированных объектов
Вот рабочий процесс:
- Элемент данных 1 является текущим элементом в памяти. Первоначально этот элемент был извлечен из кеша и клонирован с глубоким клонированием (все вспомогательные объекты, такие как словари и т. Д.). Элемент данных 1 затем редактируется, и его свойства изменяются.
- Мы сравниваем этот объект с исходной версией, хранящейся в кеше. Поскольку элемент данных 1 был клонирован и его свойства изменены, эти объекты должны быть разными.
Здесь есть пара вопросов.
Основная проблема заключается в том, что наш метод глубокого клонирования очень дорог. Мы профилировали его против мелкого клона, и он был в 10 раз медленнее. Это дерьмо. Вот наш метод глубокого клона:
public object Clone()
{
using (var memStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
binaryFormatter.Serialize(memStream, this);
memStream.Seek(0, SeekOrigin.Begin);
return binaryFormatter.Deserialize(memStream);
}
}
Мы были первоначально используя следующие клонировать:
public object Clone()
{
return this.MemberwiseClone();
}
Это было более производительным, а потому, что он делает неглубокий клон все сложные объекты, которые были свойства этот объект, например словари и т. д., не был клонирован. Объект все равно будет содержать ту же ссылку, что и объект, находящийся в кеше, поэтому при сравнении свойства будут одинаковыми.
Итак, есть ли у кого-нибудь эффективный способ сделать глубокий клон на объектах C#, которые будут охватывать клонирование всего графа объектов?
Предполагая, что вы хотите, что общий Clone() метод, потому что вы не хотите, чтобы реализовать Всеобъемлющее? –
Это клонирование только определенного объекта. Этот объект является основным объектом данных в нашем приложении. Отвечает ли это на ваш вопрос? –