c# 对象的深拷备

C# 引用类型对象在拷备时,一般有浅拷备与深拷备,浅拷备指向的是同一对象的引用地址,一个对象的修改必然会影响另一个对象,而深拷备是直接拷备对象的内容,而不是引用,拷备后的对象拥有新的引用,这里主要介绍深拷备的实现,其实现 方式有3种,好了直接上代码:

1. 首先定义一个类:

using System;
using System.IO;
namespace DemonCol
{
    [Serializable]  // 可序列化标记
   public  class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public  FileMode  MyFileMode { get; set; }
    }
}

 2. 定义深拷备方法

方法1: 通过序列化与反序列化实现深拷备

 需要添加的引用: using System.Runtime.Serialization.Formatters.Binary;  using System.IO; using System.Runtime.Serialization;

 Person 类的头部必须添加标记:  [Serializable] 

        /// <summary>
        ///  通过序列化与反序列化实现深拷备
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T DeepCopyBySerialize<T>(T obj)
        {
            object returnObj;
            using (MemoryStream ms = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                returnObj = formatter.Deserialize(ms);
                ms.Close();
            }
            return (T)returnObj;
        }

方法2:  通过 XML  序列化与反序列化实现 深拷备

需要添加的引用: using System.Xml.Serialization;

Person 类的头部可不用 标记:[Serializable] 

        /// <summary>
        /// 通过 XML  序列化与反序列化实现 深拷备
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T DeepCopyByXmlSerialize<T>(T obj)
        {
            object returnObj;
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer xs = new XmlSerializer(typeof(T));
                xs.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                returnObj = xs.Deserialize(ms);
                ms.Close();
            }
            return (T)returnObj;
        }

方法3:  通过 反射实现 深拷备

需要添加的引用: using System.Reflection;

Person 类的头部 可不用 标记:[Serializable] 

         /// <summary>
        /// 通过 反射实现 深拷备
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T DeepCopyByReflection<T>(T obj)
        {
            if (obj is string || obj.GetType().IsValueType)
                return obj;
            object returnObj = Activator.CreateInstance(obj.GetType());
            FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
            foreach (FieldInfo item in fields)
            {
                try
                {
                    item.SetValue(returnObj, DeepCopyByReflection(item.GetValue(obj)));
                }
                catch { }
            }
            return (T)returnObj;
        }

3. 客户端测试

        static void Main(string[] args)
        {
            Person person = new Person();
            person.Age = 20;
            person.Name = "will";
            person.MyFileMode = FileMode.Create;

            Person person2 = person;
            Person person3 = DeepCopyBySerialize<Person>(person);

            person.Name = "modify";
            person.Age = 10;
            person.MyFileMode = FileMode.Open;            Console.ReadKey();
        }

运行结果:

参考文章: http://www.jb51.net/article/67992.htm

时间: 2024-08-08 05:19:34

c# 对象的深拷备的相关文章

Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对NSString对象做深拷贝时,如果是copy复制方式,其实就是浅复制,只是复制了同一个对象的指针:如果是mutableCopy复制方式,系统会分配一个新的内存空间用来存放复制出来的NSMutableString对象,此时地址是新的,内容是一样的,他们正在被不同的实例变量字符串指针指着. 可变对象:

Java对象的深复制和浅复制

浅复制与深复制概念 浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 深复制(深克隆) :被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. Java的clone()方法 (1)clone方法将对象复制了一份并返回给调

Java对象的深复制----利用串行化进行深复制

把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序圈里又非常形象地称为“冷冻”或者“腌咸菜”过程:而把对象从流中读出来的并行化(Deserialization)过程则叫做“解冻”或者“回鲜”过程.应当指出的是,写到流里的是对象的一个拷贝,而原来对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝. 在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里(腌成咸菜),再从流里读回来

OkHttp的性能指标拦截(建链,握手,首包,剩余包时间)

最近,部门接到新的任务就是做httpClient,URLConnection,OKhttpClient,webview的网络性能指标进行监控,当然这些指标最准确的方法还是使用jni在底层建链与dns解析,发包等函数进行hook,再进行指标采集.但领导要求我们在java层尝试一下,今天主要记录下,我对OkHttp网络指标采集的调研结果和尝试. 1 OkHttpClient client = new OkHttpClient(); 2 Request request = new Request.Bu

实现JS对象深复制的简单方案

前段时间开jQuery源代码的时候,正好看到jQuery.extend的实现方案,忽然想到对象的深复制和浅表复制的问题. 因为引用类型对象的存在,所以简单的使用"="只能实现引用关系的复制,所以当其中一个引用指向的变量发生变化的时候,相应的另外一个引用也会发生变化. 所以很多时候也称这种复制为浅表复制.那么如何才能实现对象的深复制呢?以下是实现深复制的简单实现代码,仅供参考. 1 function copyObject(target){ 2 return _copy(target);

js 对象深复制,创建对象和继承

js 对象深复制,创建对象和继承.主要参考高级编程第三版,总结网上部分资料和自己的代码测试心得.每走一小步,就做一个小结. 1.对象/数组深复制 一般的=号传递的都是对象/数组的引用,如在控制台输入 var a=[1,2,3], b=a; b[0]=0; a[0] 此时显示的结果为0,也就是说a和b指向的是同一个数组,只是名字不一样罢了. 单层深复制: 1.js的slice函数: 返回一个新的数组,包含下标从 start 到 end (不包括该元素,此参数可选)的元素. 控制台输入: var a

Java对象深复制、浅复制

我们在编码过程经常会碰到将一个对象传递给另一个对象,java中对于基本型变量采用的是值传递,而对于对象比如bean传递时采用的引用传递也就是地址传递,而很多时候对于对象传递我们也希望能够象值传递一样,使得传递之前和之后有不同的内存地址,在这种情况下我们一般采用以下两种情况. 浅复制与深复制概念 浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 深复制(深克隆) :被复制对象

js对象浅拷贝和深拷贝详解

js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var

JAVA中对象的克隆及深拷贝和浅拷贝

使用场景: 在日常的编程过程 中,经常会遇到,有一个对象OA,在某一时间点OA中已经包含了一些有效值 ,此时可能会需一个和OA完全相对的新对象OB,并且要在后面的操作中对OB的任何改动都不会影响到OA的值,也就是OA与Ob是需要完全两个独立的对象. 但OB的初始值是由对象OA确定的.在JAVA语言中,用普通的赋值语句是满足不了需求的.使用对象的clone()方法是实现克隆的最简单.也是最高效的手段. Java的所有类都默认继承java.lang.Object类,在java.lang.Object