Эффективность использования сериализации и десериализации Json для глубокой копии - PullRequest
0 голосов
/ 28 августа 2018

У меня есть этот код:

List<Employee> employeesCopy = JsonConvert.DeserializeObject<List<Employee>>(JsonConvert.SerializeObject(employees));

Где объект Employee имеет такие свойства, как Name, DateOfBirth, Department и т. Д.

Насколько эффективен этот код для глубокого копирования списка объектов сотрудников, размер которого не превышает 200 000?

1 Ответ

0 голосов
/ 28 августа 2018

Как уже упоминалось в комментариях выше, создайте пример кода для двух методов, которые вы хотите сравнить. Но это еще не все; если вы пишете методы клонирования для каждого класса, это много повторяющегося кода с большей вероятностью создания ошибок.

Однако, если вы используете сериализацию / десериализацию JSON, вы можете создать универсальный метод расширения, который будет работать для любого объекта.

Реализация из другого SO-ответа (код скопирован из ответа):

/// <summary>
/// Perform a deep Copy of the object, using Json as a serialisation method. NOTE: Private members are not cloned using this method.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The copied object.</returns>
public static T CloneJson<T>(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<T>(JsonConvert.SerializeObject(source), deserializeSettings);
}

Чтобы выполнить эту работу с копированием свойств объекта, являющегося интерфейсом, вы должны добавить TypeNameHandling = TypeNameHandling.Auto в JsonSerializerSettings как для сериализации, так и для десериализации ( взято из этого ответа SO )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...