【发布时间】:2021-05-10 19:04:52
【问题描述】:
我有一个Dictionary<string,object>,我在其中保存对象以解析到我的插件系统,其中一些对象需要是副本而不是原始对象,因此我使用此 DeepClone 方法:
public static T DeepCloneJSON<T>(this T Obj)
{
var text = JsonSerializer.Serialize(Obj);
return JsonSerializer.Deserialize<T>(text);
}
例如,如果我这样做:
var dict = new Dictionary<string,object>(){
{"someKey",new List<MyClass>(){new MyClass()}}
}
var copy = dict["someKey"].DeepCloneJSON();
var cast = (List<MyClass>)copy;
我得到一个 System.InvalidCastException,但如果我使用 MemoryStream DeepCopy 方法,我不会得到这个异常,就像这个:
public static T DeepCloneMemoryStream<T>(this T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
所以,我想知道为什么我使用基于 System.text.json 的 DeepClone 方法得到这个异常,以及是否可以使用 System.text.json 来做到这一点,因为在我的测试中它表现得更快并且比基于 onde 的 MemoryStream 使用更少的内存。
【问题讨论】:
-
因为您正在调用
DeepCloneJSON<object>,而后者又调用JsonSerializer.Deserialize<object>而不是JsonSerializer.Deserialize<MyClass>。您将需要反射才能使用正确的类型参数调用DeepCloneJSON。虽然您是否应该通过 JSON 进行深度克隆是一个不同的问题......
标签: c# dictionary exception deep-copy generic-list