Все зависит от того, что вы хотите скопировать, и какой сериализатор вы планируете использовать.Дело в том, что с сериализаторами некоторые могут фактически использовать отражение в качестве основного механизма построения объектов.
Edit # 1: Насколько я знаю, BinaryFormatter
используемый вашим классом использует рефлексию для выполнения своей работы.Итак, вопрос в том, можете ли вы написать (быстрее?) Пользовательский код отражения для ваших типов, чем Microsoft для общего сценария?
Edit # 2: Из любопытства я запустил простойтестовое задание.BinaryFormatter
против отражения с точки зрения выполнения мелкая копия .Код отражения, который я использовал, можно увидеть здесь:
var newPerson = Activator.CreateInstance<Person>();
var fields = newPerson.GetType().GetFields(BindingFlags.Public
| BindingFlags.Instance);
foreach (var field in fields)
{
var value = field.GetValue(person);
field.SetValue(newPerson, value);
}
Каковы результаты по сравнению с классом ObjectCopier
, который вы используете?Отражение, кажется, работает в 7 раз быстрее , чем код сериализации.Однако это относится к классу Person
с открытыми полями .Для свойств разница все еще заметна, но она только в 2 раза быстрее.
Я предполагаю, что разница заключается в том, что BinaryFormatter
необходимо использовать потоки, которые вносят дополнительные издержки.Тем не менее, это только мое предположение, которое может быть далеко от фактов.
Исходный код для используемой мной программы тестирования можно найти здесь .Любой может указать на недостатки и возможные проблемы с этим: -)
Sidenote
Как и все "Мне было интересно ..." тесты, я предлагаю вам взять его с зерном соли.Такие оптимизации должны быть сделаны только тогда, когда их производительность действительно становится проблемой.