我一直在阅读很多其他问题以及很多谷歌搜索,我一直无法找到一个明确的解决方案.
基于我读过的一些最佳实践,类的静态方法应该是线程安全的,实例成员应该为消费者提供线程安全性.
我想为该类实现深度复制方法.该类本身具有其他引用类型成员.有没有办法使深度复制方法线程安全,而不必将开销强加给类的所有实例成员?
我正在尝试使用deepcopy(从copy模块)深度复制模块中的节点树ast.
这似乎不起作用.我遇到了奇怪的错误,比如TypeError: required field "name" missing from FunctionDef当我使用复制的结果时(我检查了它;它在复制的节点中确实丢失了),所以它没有正确地复制它们.
有什么技巧可以使这个工作吗?或许我错过了什么?
我有两个相同类型的对象,需要将属性值从一个对象复制到另一个对象.有两种选择:
使用反射,浏览第一个对象的属性并复制值.
序列化第一个对象并反序列化副本.
两者都符合我的要求,问题是我在速度(成本)方面更好地使用哪些?
例
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 p1到Person 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) 我有以下两个结构,其中"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) 如何在Scala中执行2D数组的深层复制?
例如
val a = Array[Array[Int]](2,3)
a(1,0) = 12
Run Code Online (Sandbox Code Playgroud)
我希望val b复制a的值但不指向同一个数组.
我正在使用来自第三方DLL的实例类,我需要在特定实例上进行深层复制.该类未标记为Serializable,因此我无法使用此建议的方法BinaryFormatter.
如何在不使用序列化的情况下获取此对象的深层副本?
我已经尝试过并且惊讶于如何使用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中生成输出?
提前致谢.
在下面的示例中,我希望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) 我一直致力于使用PDFView4Net创建PDF表单的项目.虽然库通常很好,但在使用表单字段(即文本框,复选框等)时,表单创建器是原始的并且缺少基本功能(例如复制/粘贴,对齐,格式化等).
问题:我一直在扩展字段对象的功能,并在复制/粘贴时被绊倒.要做到这一点,我需要一个对象的深层副本,而不需要引用任何原始对象.我通过电子邮件发送给供应商,要求提供有关他们推荐的复制这些对象的方法的信息,他们回复说我需要手工制作每个属性的副本,手动...在桌面上敲打.这些是大类,具有多个嵌入类作为属性,以及UI元素.
问题:是否有任何好的方法可以为不需要序列化的复杂对象执行深层复制,不需要访问或更改源类,也不需要默认构造函数?
我尝试过/审查过的内容:我研究了各种方法来制作一个对象的深层副本并逐个丢弃它们:
编辑:我真的不觉得这个问题是重复的.我已经广泛搜索了一个解决方案,包括标记为重复/原始的帖子,但无法找到满意的解决方案.如上所述,我无权更改我需要复制的类.这折扣了DataContractSerializer,BinaryFormatter和任何其他类型的序列化.这也打破了我使用Activator.CreateInstance看到的反射示例,因为我需要复制的类中大约95%没有带0参数的构造函数.这与我使用ValueInjecter遇到的问题相同.这也使用ICloneable进行折扣.
我目前正在研究Java的图形库.如你所料,有一个Vertex班级.该类包含一个类型的对象,VertexData<T>它本身可以包含任何东西.
(我知道这可能是多余的,我可以这样做,Vertex<T>但为了问题的目的,这无关紧要).
我制作了一个VertexData<T>实现,Cloneable并有一个public VertexData<T> clone() 方法通过序列化和反序列化调用返回深层副本,Object就像这里描述的那样
现在问题是,因为我确实有一个深度复制方法,所以有一个浅拷贝是否有意义?如果是这样的话,那么浅拷贝比深拷贝更受欢迎的情况是什么?
更新:由于大多数答案和评论都包含对浅层副本的某种解释,我觉得我必须澄清一点.我知道浅色副本是什么,它是如何工作的,一切.我的问题是,因为它是我正在开发的库,并且因为我确实创建了一个深度复制方法,所以为浅层复制提供方法是否有意义?
我也在这里添加,VertexData<T>类中没有原始类型.
因此,在用于存储图库的 Vertex数据的容器类的上下文中,是否需要浅层复制?
如果是这样,你能想到一个例子,在我正在开发的范围内吗?
如果不是我应该只为了完整性添加浅拷贝方法?
这是一个好习惯还是没关系?