任何人都知道是否有一种简单或已知的方法来编写深度复制方法,它可以在任何类型的数组上工作,即锯齿状,多维等等?我打算把它写成一种扩展方法。
框架中没有默认方法来执行此操作,对吧?我很惊讶没有找到一个。
我已经看到了一些基于序列化的实现,它们很慢,所以我想要一个不使用任何类型的序列化的解决方案。
答案 0 :(得分:5)
这个问题的现状有点不清楚;它可能一个duplicate(在删除的回复中注明),但评论表明这不太合适。
重新序列化减慢了速度 - 不幸的是,.NET中没有适当支持的“深度克隆”功能。有ICloneable
,但这是:很少使用,b:没有说明浅或深。因此,深度克隆数据的唯一剩余可靠方法是使用序列化。
重新“慢下来”,你能量化吗?使用哪种序列化机制? (BinaryFormatter
?XmlSerializer
?)。有关信息,您可能对protobuf-net感兴趣,这是一个非常快速和有效的替代二进制序列化器(并提供了非常方便的T DeepClone<T>(T)
方法) - 但是,它只适用于标记为具体方式(例如,它可以使用[DataContract]
标记或定制的[ProtoContract]
标记。但是,它比内置的序列化器quicker。
唯一可行的选择是编写您自己的,每类型的深层复制例程,并可能将其(作为Func<T,T>
或Converter<T,T>
委托)传递给您的扩展方法。
如果您只想要一个浅副本,事情会更容易,因为您可以使用反射等Here's an option使用已编译的Expression
创建浅层副本(.NET 3.5)提高性能。
答案 1 :(得分:-1)
我首先要看一眼:
internal static class Prototype
{
public static T DeepCopy<T>(this IPrototype<T> target)
{
T copy;
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, (T)target);
stream.Seek(0, SeekOrigin.Begin);
copy = (T) formatter.Deserialize(stream);
stream.Close();
}
return copy;
}
}
如果这不是你想要的那么快,那么我会优化。