Хотя стандартная практика заключается в реализации интерфейса ICloneable
(описанный здесь здесь , поэтому я не буду срыгиваться), вот хороший клон для клон-клонов, который я нашел на Код проекта некоторое время назад и включил его в наш материал.
Как уже упоминалось в другом месте, это требует, чтобы ваши объекты были сериализуемыми.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
///
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
///
public static class ObjectCopier
{
///
/// Perform a deep Copy of the object.
///
/// The type of object being copied.
/// The object instance to copy.
/// The copied object.
public static T Clone(T source)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "source");
}
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
}
Идея состоит в том, что он сериализует ваш объект и затем десериализует его в новый объект. Преимущество в том, что вам не нужно беспокоиться о клонировании всего, когда объект становится слишком сложным.
И с использованием методов расширения (также из исходного источника):
Если вы предпочитаете использовать новые методы расширения для C # 3.0, измените метод на наличие следующей сигнатуры:
public static T Clone(this T source)
{
//...
}
Теперь вызов метода просто становится objectBeingCloned.Clone();
.
EDIT (10 января 2015 г.) Думал, что передумал, отметив, что я недавно начал использовать (Newtonsoft) Json для этого, он должен быть легче, и избегает накладные расходы [Сериализуемые] теги. (NB @atconway указал в комментариях, что частные члены не клонируются с использованием метода JSON)
///
/// Perform a deep Copy of the object, using Json as a serialisation method. NOTE: Private members are not cloned using this method.
///
/// The type of object being copied.
/// The object instance to copy.
/// The copied object.
public static T CloneJson(this T source)
{
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
// initialize inner objects individually
// for example in default constructor some list property initialized with some values,
// but in 'source' these items are cleaned -
// without ObjectCreationHandling.Replace default constructor values will be added to result
var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source), deserializeSettings);
}
Можно использовать IDA Pro Шестнадцатеричные Лучи . Вы не будете обычно вытаскивать хороший C++ из двоичного файла, если Вы не скомпилировали в отладочной информации. Подготовьтесь тратить партия из физического труда, инвертирующего код.
, Если Вы не разделяли двоичные файлы, существует некоторая надежда, поскольку IDA Pro может произвести код C-alike для Вас для работы с. Обычно это очень грубо, хотя, по крайней мере, когда я использовал его несколько лет назад.
информация отбрасывается в процессе компиляции. Даже если декомпилятор мог бы произвести логический эквивалентный код с классами и всем (это, вероятно, не может), части самодокументирования не стало в оптимизированном коде выпуска. Никакие имена переменной, никакие стандартные имена, никакие имена классов - просто не обращаются.
Да, но ни одному из них не удастся произвести достаточно читаемый код для стоящего усилия. Вы проведете больше времени, пытаясь считать декомпилируемый источник с ассемблерными блоками внутри, чем перезапись Вашего старого приложения с нуля.
Я не видел декомпиляторов, которые генерируют код C++. Я видел несколько экспериментальных, которые предпринимают разумную попытку генерации C код, но они имели тенденцию зависеть от соответствия шаблонам генерации кода конкретного компилятора (который, возможно, изменился, это было некоторое время, так как я в последний раз изучил это). Конечно, любая символьная информация закончится. Google для "декомпилятора".
В зависимости от того, насколько большой, и насколько правильно написанный исходный код был, это могло бы стоить запустить снова на Вашем любимом языке (который мог бы все еще быть C++), и учащийся на любых ошибках, сделанных в последней версии. Кто-то однажды не сказал о записи той для выбрасывания?
n.b. Очевидно, если это - огромный продукт, то это не может стоить времени.