什么是多次克隆对象的最快方法

时间:2017-02-03 17:37:06

标签: c# deserialization cloning

我需要多次克隆漂亮的大对象,我发现了更快的方法。

现在我使用BinaryForamter序列化到MemoryStream。所以这就是我想要使用的功能我正在谈论的(DeserializeToList是我正在寻找的方法):

var originalObject = new MyClass();
var objectClones = new List<MyClass>();
var cloneCount = 10;

var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
  formatter.Serialize(stream, originalObject);
  stream.Seek(0, SeekOrigin.Begin);
  objectClones = (MyClass)formatter.DeserializeToList(formatter, cloneCount);
}

有人有什么想法吗?

更新
我不想改变MyClass。这就是我使用二进制序列化的原因。所以MyClass.Clone暂时不是解决方案。

更新2:
我不想触摸MyClass或他们的财产。因此,手动复制属性不是我正在寻找的方式。

2 个答案:

答案 0 :(得分:1)

如果您不想触及原始课程,可以使用扩展方法。

public class MyClass
{
    public string Name { get; set; }
}

public static class MyClassExtensions
{
    public static MyClass Clone(this MyClass obj)
    {
        return new MyClass()
        {
            Name = obj.Name
        };
    }
}

然后使用它:

var originalObj = new MyClass() { Name = "Original" };
var clonedObj = originalObj.Clone();
Console.WriteLine(clonedObj.Name); // Name = "Original"

答案 1 :(得分:0)

我没有测试基准测试的性能,但为什么不实现Clone接口?

public interface ICloneable<T>
{
    T Clone();
}

public class ComplessObj : ICloneable<Book>
{
    public string f1;
    public int f2;
    .. and so on

    public ComplessObj Clone()
    {
        return new ComplessObj { /* set properties f1,f2 ..*/ };
    }
}

每次你想要复杂对象的深层克隆列表

您可以使用LINQ

List<ComplessObj> ComplessObj_2 = ComplessObj.Select(co => co.Clone()).ToList();

List<ComplessObj> ComplessObj_2 = ComplessObj.ConvertAll(co => co.Clone());