【问题标题】:What is the fastest way to clone object several times多次克隆对象的最快方法是什么
【发布时间】:2017-02-03 17:37:06
【问题描述】:

我需要多次克隆相当大的对象,我正在寻找更快的方法。

现在我使用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 或它们的属性。所以手动复制属性不是我想要的。

【问题讨论】:

  • 如果您的对象与您建议的一样大,请记住,此解决方案将需要大约 3 倍的内存来执行克隆操作。原始对象 + 内存流 + 克隆对象。通过手动克隆所需的字段,您可能可以获得更快的性能和更好的内存利用率。
  • @BradleyUffner 是的,没错。但我暂时不想更改MyClass
  • 然后检查序列化代理。它允许您在不修改原始类的情况下进行手动二进制序列化。这可能是一个有点复杂的想法
  • @BradleyUffner 你能解释一下你建议如何使用序列化代理

标签: c# deserialization cloning


【解决方案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"

【讨论】:

  • 我可以更改MyClass,但我不想这样做。所以像扩展方法这样的解决方法并不比普通的Clone方法好。
【解决方案2】:

我没有测试benchmark的性能,但是为什么不实现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());

【讨论】:

  • 感谢您的评论,但我不想更改MyClass
猜你喜欢
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多