Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对深度副本使用Json序列化和反序列化的效率_C#_Json_Performance - Fatal编程技术网

C# 对深度副本使用Json序列化和反序列化的效率

C# 对深度副本使用Json序列化和反序列化的效率,c#,json,performance,C#,Json,Performance,我有以下代码: List<Employee> employeesCopy = JsonConvert.DeserializeObject<List<Employee>>(JsonConvert.SerializeObject(employees)); List EmployeeScope=JsonConvert.DeserializeObject(JsonConvert.SerializeObject(employees)); 其中员工对象具有诸如姓名、出

我有以下代码:

List<Employee> employeesCopy = JsonConvert.DeserializeObject<List<Employee>>(JsonConvert.SerializeObject(employees));
List EmployeeScope=JsonConvert.DeserializeObject(JsonConvert.SerializeObject(employees));
其中
员工
对象具有诸如
姓名
出生日期
部门
等属性


此代码用于不超过200000大小的员工对象列表的深度副本的效率如何?

如上面评论中所述,为您要比较的两种方法制作一个代码示例。 但还有更多; 如果您为每个类编写克隆方法,那么会有大量重复代码,产生bug的可能性更高

但是,如果使用JSON序列化/反序列化,则可以创建适用于任何对象的通用扩展方法

实施来源(从应答中复制的代码):

//
///使用Json作为序列化方法,执行对象的深度复制。注意:不能使用此方法克隆私有成员。
/// 
///要复制的对象的类型。
///要复制的对象实例。
///复制的对象。
公共静态T CloneJson(此T源)
{
//不要序列化空对象,只需返回该对象的默认值
if(Object.ReferenceEquals(source,null))
{
返回默认值(T);
}
//单独初始化内部对象
//例如,在默认构造函数中,某些列表属性使用某些值初始化,
//但在“源”中,这些项目已清理-
//没有ObjectCreationHandling。替换默认构造函数值将添加到结果中
var deserializeSettings=new JsonSerializerSettings{ObjectCreationHandling=ObjectCreationHandling.Replace};
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(源),反序列化设置);
}

要使此操作能够复制作为接口的对象的属性,必须将
TypeNameHandling=TypeNameHandling.Auto
添加到JsonSerializerSettings中,以实现序列化和反序列化()

回答这个问题的一个非常简单的方法是简单地尝试一下——你可以很快地拼凑一些代码,创建一个200000个
员工
对象的列表,并使用
秒表来计时需要多长时间我猜你忽略了问题的另一半,效率与什么相比?但正如@BenCottrell所提到的,最好的方法是汇总一些基准并选择您的favorite@BenCottrell已用[时间]=00:00:01.5838072。在我看来,对于200000个employee对象来说,这实际上相当不错。@general,我想这与创建自己的deepcopy类相比。
/// <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);
}