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);
}