标签: deep-copy

c#Thread Safe Deep Copy

我一直在阅读很多其他问题以及很多谷歌搜索,我一直无法找到一个明确的解决方案.

基于我读过的一些最佳实践,类的静态方法应该是线程安全的,实例成员应该为消费者提供线程安全性.

我想为该类实现深度复制方法.该类本身具有其他引用类型成员.有没有办法使深度复制方法线程安全,而不必将开销强加给类的所有实例成员?

c# locking deep-copy thread-safety

9
推荐指数
1
解决办法
3164
查看次数

Python:深度复制ast节点树

我正在尝试使用deepcopy(从copy模块)深度复制模块中的节点树ast.

这似乎不起作用.我遇到了奇怪的错误,比如TypeError: required field "name" missing from FunctionDef当我使用复制的结果时(我检查了它;它在复制的节点中确实丢失了),所以它没有正确地复制它们.

有什么技巧可以使这个工作吗?或许我错过了什么?

python copy deep-copy abstract-syntax-tree

9
推荐指数
1
解决办法
1435
查看次数

复制对象属性:反射或序列化 - 哪个更快?

我有两个相同类型的对象,需要将属性值从一个对象复制到另一个对象.有两种选择:

  1. 使用反射,浏览第一个对象的属性并复制值.

  2. 序列化第一个对象并反序列化副本.

两者都符合我的要求,问题是我在速度(成本)方面更好地使用哪些?

class Person
{
    public int ID { get; set; }
    public string Firsthand { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public decimal Weight { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

需要的属性值从复制Person p1Person p2.

对于这个简单的样本 - 哪种方法更快?

更新

对于序列化,我使用此处建议的ObjectCopier:深度克隆对象

对于反射,我使用此代码:

foreach (PropertyInfo sourcePropertyInfo in copyFromObject.GetType().GetProperties())  
{
    PropertyInfo destPropertyInfo = copyToObject.GetType().GetProperty(sourcePropertyInfo.Name);

    destPropertyInfo.SetValue(
        copyToObject,
        sourcePropertyInfo.GetValue(copyFromObject, null),
        null);
}
Run Code Online (Sandbox Code Playgroud)

c# serialization deep-copy shallow-copy deserialization

9
推荐指数
2
解决办法
2万
查看次数

C编程.如何深度复制结构?

我有以下两个结构,其中"child struct"有一个"rusage struct"作为元素.

然后我创建两个类型为"child"的结构,让我们称它们为childA和childB

如何将childA的rusage结构复制到childB?

typedef struct{                         
        int numb;
        char *name;
        pid_t pid;
        long userT;
        long systemT;
        struct rusage usage;
}child;


typedef struct{
    struct timeval ru_utime; /* user time used */
    struct timeval ru_stime; /* system time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* …
Run Code Online (Sandbox Code Playgroud)

c struct deep-copy memcpy

8
推荐指数
2
解决办法
3万
查看次数

Scala中2D数组的深层副本?

如何在Scala中执行2D数组的深层复制?

例如

val a = Array[Array[Int]](2,3)
a(1,0) = 12
Run Code Online (Sandbox Code Playgroud)

我希望val b复制a的值但不指向同一个数组.

arrays scala deep-copy

8
推荐指数
2
解决办法
3715
查看次数

深度复制.NET类实例而不进行序列化

我正在使用来自第三方DLL的实例类,我需要在特定实例上进行深层复制.该类未标记为Serializable,因此我无法使用此建议的方法BinaryFormatter.

如何在不使用序列化的情况下获取此对象的深层副本?

.net instance deep-copy

8
推荐指数
1
解决办法
7046
查看次数

使用Ext JS进行jQuery深度复制?

我已经尝试过并且惊讶于如何使用ExtJS.让我用代码块解释一下.

在jQuery中

console.clear();
var a = {
    b: 5,
    c: 4,
    o: {
        l: 2,
        p: 2
    }
}

var b = {
    k: 4,
    l: 3,
    c: 5,
    o: {
        m: 2,
        l: 1
    }
}

var ex = $.extend(true, a, b);
console.dir(ex)

这是输出

ex = {
    a: {
        q: 2
    },
    b: 5,
    c: 5,
    o: {
        l: 1,
        p: 2,
        m: 2
    }
}

Ext apply,applyIf,copyTo不能像这样工作.如何在ExtJS中生成输出?

提前致谢.

extjs object deep-copy extend

8
推荐指数
2
解决办法
4573
查看次数

Python:deepcopy不适用于用户定义的类?

在下面的示例中,我希望deepcopy可以创建字段的副本,而不仅仅是复制引用.这里发生了什么,有一个简单的方法吗?

from copy import deepcopy

class Test:
    field = [(1,2)]

t1 = Test()
t2 = deepcopy(t1)

t2.field[0]=(5,10)

print t1.field # [(1,2)] expected but [(5,10)] obtained
print t2.field # [(5,10)] expected
Run Code Online (Sandbox Code Playgroud)

输出:

[(5, 10)]
[(5, 10)]
Run Code Online (Sandbox Code Playgroud)

python deep-copy

8
推荐指数
1
解决办法
6474
查看次数

复杂第三方对象/类的深层复制

我一直致力于使用PDFView4Net创建PDF表单的项目.虽然库通常很好,但在使用表单字段(即文本框,复选框等)时,表单创建器是原始的并且缺少基本功能(例如复制/粘贴,对齐,格式化等).

问题:我一直在扩展字段对象的功能,并在复制/粘贴时被绊倒.要做到这一点,我需要一个对象的深层副本,而不需要引用任何原始对象.我通过电子邮件发送给供应商,要求提供有关他们推荐的复制这些对象的方法的信息,他们回复说我需要手工制作每个属性的副本,手动...在桌面上敲打.这些是大类,具有多个嵌入类作为属性,以及UI元素.

问题:是否有任何好的方法可以为不需要序列化的复杂对象执行深层复制,不需要访问或更改源类,也不需要默认构造函数?

我尝试过/审查过的内容:我研究了各种方法来制作一个对象的深层副本并逐个丢弃它们:

  • 通过苦心财产手动获取属性:我尝试使用7个字段对象中的第一个(PDFTextBoxField),但它很快就失控了,这些属性也是不同类型的类.最后,我仍然对原始对象进行了延迟引用,其中创建了一个浅层副本,而不是按照预期创建了一个深层副本.
  • 序列化:类没有标记为Serializable,供应商也不会更改它.我问他们,他们说没有.
  • ICloneable:需要由供应商实施.
  • AutoMapper:这似乎是用于将数据从一个或多个对象类型复制到另一个对象类型.我正在使用的对象是相同的类型.虽然我不反对使用它,但它是最好的解决方案.
  • Emit Mapper:这个项目似乎已被放弃.
  • MemberwiseClone:是一个浅层副本,而不是我正在寻找的深层副本,尽管当提问者特别要求深层复制时,这在大量其他帖子中被建议.
  • Value Injecter:我在CodePlex上从ValueInjecter实现了FastDeepCloneInjection,但是大多数需要注入的类都没有0参数构造函数,这在为副本创建新实例时是必需的.ValueInjecter不允许跳过某些属性,或者我只是跳过没有默认构造函数的项,并将它们设置为null(默认值).第一堂课就是我立刻遇到的.为了解决这个问题,我创建了一个从原始继承的包装类,并将原始文件转换为包装器(反之亦然),但我不认为这是一个很好的解决方案.

编辑:我真的不觉得这个问题是重复的.我已经广泛搜索了一个解决方案,包括标记为重复/原始的帖子,但无法找到满意的解决方案.如上所述,我无权更改我需要复制的类.这折扣了DataContractSerializer,BinaryFormatter和任何其他类型的序列化.这也打破了我使用Activator.CreateInstance看到的反射示例,因为我需要复制的类中大约95%没有带0参数的构造函数.这与我使用ValueInjecter遇到的问题相同.这也使用ICloneable进行折扣.

c# clone deep-copy automapper valueinjecter

8
推荐指数
1
解决办法
1091
查看次数

真的需要浅拷贝吗?

我目前正在研究Java的图形库.如你所料,有一个Vertex班级.该类包含一个类型的对象,VertexData<T>它本身可以包含任何东西.
(我知道这可能是多余的,我可以这样做,Vertex<T>但为了问题的目的,这无关紧要).
我制作了一个VertexData<T>实现,Cloneable并有一个public VertexData<T> clone() 方法通过序列化和反序列化调用返回深层副本,Object就像这里描述的那样

现在问题是,因为我确实有一个深度复制方法,所以有一个浅拷贝是否有意义?如果是这样的话,那么浅拷贝比深拷贝更受欢迎的情况是什么?

更新:由于大多数答案和评论都包含对浅层副本的某种解释,我觉得我必须澄清一点.我知道浅色副本是什么,它是如何工作的,一切.我的问题是,因为它是我正在开发的,并且因为我确实创建了一个深度复制方法,所以为浅层复制提供方法是否有意义?

我也在这里添加,VertexData<T>类中没有原始类型.
因此,在用于存储图库的 Vertex数据的容器类的上下文中,是否需要浅层复制?
如果是这样,你能想到一个例子,在我正在开发的范围内吗?
如果不是我应该只为了完整性添加浅拷贝方法?
这是一个好习惯还是没关系?

java generics deep-copy

8
推荐指数
1
解决办法
711
查看次数