C#------如何深度克隆一个对象】的更多相关文章

Javascript中的对像赋值与Java中是一样的,都为引用传递.就是说,在把一个对像赋值给一个变量时,那么这个变量所指向的仍就是原来对 像的地址.那怎么来做呢?答案是“克隆”. 克隆有两种方法:一种是“浅克隆”,一种是“深克隆”(深度克隆). 浅克隆:基本类型为值传递,对象仍为引用传递. 深克隆(深度克隆):所有元素均完全复制,并于原对象完全独立(原对象的修改不影响新对象). 深度克隆的代码如下(深克隆去掉递归即为浅克隆): Object.prototype.clone = function…
普通版: public static object CloneObject( object obj ) { using ( MemoryStream memStream = new MemoryStream( ) ) { BinaryFormatter binaryFormatter = new BinaryFormatter( null , new StreamingContext( StreamingContextStates.Clone ) ); binaryFormatter.Seria…
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目考查的知识点还是蛮多的,尤其是对基础知识的考查.好了,闲话不多说,开始正题. 一.js中的对象   谈到对象的克隆,必定要说一下对象的概念.   js中的数据类型分为两大类:原始类型和对象类…
突然想到有一回面试的时候有一个问题一直挂在心头,于是乎在网上找了找,这个比较好: //深度克隆 function deepClone(obj) { var result, oClass = isClass(obj); //确定result的类型 if (oClass === "Object") { result = {}; }else if (oClass === "Array") { result = []; }else { return obj; } for (…
一.js中的对象 谈到对象的克隆,必定要说一下对象的概念. js中的数据类型分为两大类:原始类型和对象类型. (1)原始类型包括:数值.字符串.布尔值.null.undefined(后两个是特殊的原始值,这里不做详细的说明,我的上一篇博客有谈到过一些) (2)对象类型包括:对象即是属性的集合,当然这里又两个特殊的对象----函数(js中的一等对象).数组(键值的有序集合). 好了既然对象分为这两类,这两种类型在复制克隆的时候是有很大区别的.原始类型存储的是对象的实际数据,而对象类型存储的是对象的…
在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是一样的,改变了谁都改变了 内存中的数据. 于是找到了一个取巧的方法就是先把旧对象转化为字符串 然后 在转化为对象给新对象,虽然可以达到效果,但是总感觉有点不正规.于是想到了深度克隆 function cloneObjectFn (obj){ // 对象复制 return JSON.parse(JSO…
说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来.clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这个接口没有什么方法,和Comparable接口差不多,仅仅是起一个标志作用,实现了这个接口你就能实现克隆操作. 这里有两个概念,深度克隆和浅度克隆,这东西虽然平常不怎么用,但是了解一下还是有必要的.Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进…
关于java List的深度克隆 List是java容器中最常用的顺序存储数据结构之一.有些时候我们将一组数据取出放到一个List对象中,但是可能会很多处程序要读取他或者是修改他.尤其是并发处理的话,显然有的时候有一组数据有的时候是不够用的.这个时候我们通常会复制出一个甚至多个克隆List来执行更多的操作. 常见的List的克隆方式有很多,下面我们来列举几种常见的List复制的方式: (首先还是构造一个简单的原始list对象) List<String> listString0 = new Ar…
java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多(c++中还要有另一种方式用于全…
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt128 为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.在Java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求有很多途径. 克隆的实现方式 一.浅度克隆…
这篇文章主要来讲HTML5中的新方法:parse()把字符串转换成josn格式的数据和stringify()把josn格式的数据转换成字符串 eval()方法的回顾 eval()方法可以将任何字符串解析成js,下面来解析一个函数,并且解析完后执行这个函数 var str = 'function show(){alert(3)}'; eval(str); show(); //结果可以alert出3 但是这个方法有个缺点,就是如果这个字符串里面带有攻击性的代码,那么转换成js后就会不安全 parse…
赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况. 但是如果你复制的是一个对象.list集合的情况下,情况就有些复杂了. class Student { private int number; public int getNumber()…
有人问,拷贝和克隆不都是“复制”的意思吗. 这位看官问的好,一般情况下是一样的,但在jquery中却有些不同.jqurey深度拷贝一般只js对象的复制,是$.extend()方法,jquery深度克隆一般指dom对象的复制,是$.clone()方法. $.extend() 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 用途:复制js对象,或将两个或更多对象的内容合并到第一个对象. 深浅拷贝对应的参数就是[deep],是可选的,…
1.BeanUtil本地简单测试在项目中由于需要对某些对象进行深度拷贝然后进行持久化操作,想到了apache和spring都提供了BeanUtils的深度拷贝工具包,自己写了几个Demo做测试,定义了两个类User和Person,其中User的属性引用了Person类. public class User { private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday…
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只对了一半,因为用clone()时,除了基础数据和String类型的不受影响外,其他复杂类型(如集合.对象等)还是会受到影响的!除非你对每个对象里的复杂类型又进行了clone(),但是如果一个对象的层次非常深,那么clone()起来非常复杂,还有可能出现遗漏! 既然用等号和clone()复制对象都会对…
在项目中,有时候有一些比较重要的对象经常被当作参数传来传去,和C语言的值传递不同,java语言的传递都是引用传递,在任何一个地方修改了这个对象的值,就会导致这个对象在内存中的值被彻底改变.但是很多时候我们并不想去真正的改变这个对象,只是使用它的某些属性,却因为不小心改变后忘记了恢复,或者被团队中不知情的别人给改变了.这样的话,后果将是不可预料的,可能会花上很久也发现不了自己的对象在哪被改了,尤其在大型项目中,很多人都在操作同一个对象,一旦有人在对象的主人不知情的情况下,修改了这个对象的值,那么很…
javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组(Array).对象(Object).函数(Function). 既然对象分为这两类,他们之间的最大差别是复制克隆的差别.普通对象存储的是对象的实际数据,而引用对象存储的是对象的引用地址,而把对象的实际内容单独存放,因为引用对象通常比较庞大,这是数据开销和内存开销优化的手段.通常初学者很难理解这部分内…
一:使用目的: 就是为了快速构造一个和已有对象相同的副本.如果需要克隆对象,一般需要先创建一个对象,然后将原对象中的数据导入到新创建的对象中去,而不用根据已有对象进行手动赋值操作. 二:Object中的clone()方法 protected native Object clone() throws CloneNotSupportedException; 说明:1.这是一个navtive方法  2.要使用该方法必须继承Object类,因为修饰符为protected  3.返回值为Object,需要…
赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况. 但是如果你复制的是一个对象.list集合的情况下,情况就有些复杂了. class Student { private int number; public int getNumber()…
js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内存中的地址. 克隆或者拷贝分为2种: 浅度克隆:基本类型为值传递,对象仍为引用传递. 深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改. 大白话深度克隆和浅克隆:http://blog.csdn.net/java2000_net/artic…
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js对象的深度克隆</title> </head> <body> <script type="text/javascript"> var cloneObj = function(obj) { var s…
javascript最新深度克隆对象方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http…
1.javascript深度克隆: //注意这里的对象包括object和array function cloneObject(obj){ var o = obj.constructor === Array ? [] : {}; for(var key in obj){ if(obj.hasOwnProperty(key)){ o[key] = typeof obj[key] === "object" ? cloneObject(obj[key]) : obj[key]; } } ret…
首先,我们要知道,javascript中除了基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说就是js对象了. 引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响. 在探讨到深度克隆之前,我们先来看一下下面的例子: example01: var a = [1,2,3]; var b = a; // a b共用一个引用 b.push(4); alert(b); // [1,2,3,4]…
1.JavaScript的五种基本数据类型: Number.String.Boolean.null.undefined. 2.typeof返回的六种数据类型: Number.String.Boolean.undefined.function.object. 其中object为复式数据类型,它包含null,array,json等复式数据. 3.对象(object)引用 对象类型(复式数据类型)在内存空间中只占一个内存空间,其变量名就是对该对象所在空间的地址的引用. var b=a=[1,2,3];…
/* * 克隆一个对象 */ com.ty.repairtech.JsonOperation.clone = function(obj) { // Handle the 3 simple types, and null or undefined if (null == obj || "object" != typeof obj) return obj; // Handle Date if ( obj instanceof Date) { var copy = new Date(); c…
首先看一个例子: var student = { name:"yxz", age:25 } var newStudent = student; newStudent.sex = "male"; console.log(student); //{name:"yxz",age:25,sex:"male"} 由此可见,将一个对象通过简单的传递赋值传递给一个新的变量时,仅仅是给该对象增添了一个别名.所以,对该别名的操作也会作用到原对象…
有基础的开发者都应该很明白,对象是一个引用类型,例如: object b=new object(); object a=b; 那么a指向的是b的地址,这样在有些时候就会造成如果修改a的值,那么b的值也会跟随着改变(a和b是同一个引用内存地址). 我们想要a和b都是各自互不影响的,那么只能是完全地新建一个新的对象,并且把现有对象的每个属性的值赋给新的对象的属性.也就是值类型的复制,这个操作就叫深度克隆. 这里我们写两个泛型方法分别对对象T和集合List<T>进行深度克隆的实现,我们的方法实现方式…
索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .DeepClone() 即可得到该对象的深度克隆 2.不受对象层次深度限制,均可实现深度克隆(下面会给出几个简单示例 ... ...) 二.API 使用 1.命名空间,只需: using MyDAL.ModelTools; 2.被深度克隆的对象只需是一个 class ,如下: public class M…
1. 如何实现深度克隆 利用 JSON 方法 (没办法克隆函数数据) `JSON.parse(JSON.stringify(xxx))` 自定义方法 检查所有数据类型的方法 `Object.prototype.toString.call(obj).slice(8, -1)` function deepClone(obj) { let newObj = null; //判断obj是否是对象或者数组 const type = checkType(obj); if (type === 'Object'…