首页 > Windows开发 > 详细

利用序列化的方式实现C#深复制和浅复制

时间:2015-10-19 12:13:18      阅读:352      评论:0      收藏:0      [点我收藏+]

 

代码如下:具体看注释

   [Serializable]
    public class A
    {
        public virtual string Name { get; set; }
        public int Age { get; set; }

    }


   class Program
    {
        static void Main(string[] args)
        { 
            ShallowCopyTest(); 
       DeepCopyTest();
    }

      // 利用序列化和反序列化的方式
        public static T DeepClone<T>(T obj)
        {
            using (var ms = new MemoryStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(ms, obj);
                ms.Position = 0;
                return (T)formatter.Deserialize(ms);
            }
        }
        // 深复制
        public static void DeepCopyTest()
        {
            List<A> a = new List<A>();
            a.Add(new A { Age = 1, Name = "1" });
            a.Add(new A { Age = 2, Name = "2" });
            List<A> a1 = new List<A>();
            a.ForEach((item) =>
            {
                a1.Add(DeepClone<A>(item));
            });
            a1[0].Age = 10; //a[0]的Age不会受影响
            Console.WriteLine(a[0].Age);
            Console.ReadKey();
        }
        // 浅复制
        public static void ShallowCopyTest()
        {
            List<A> a = new List<A>();
            a.Add(new A { Age = 1, Name = "1" });
            a.Add(new A { Age = 2, Name = "2" });
            List<A> a1 = new List<A>();
            a.ForEach((item) => { a1.Add(item); });
            a.ForEach((item) => { a1.Add(item); }); // 列表项的内存地址只有一份
            a1[0].Age = 3; // a[0]的Age也会变成3
            Console.WriteLine(a[0].Age);
            Console.ReadKey();
        }    
}

 

利用序列化的方式实现C#深复制和浅复制

原文:http://www.cnblogs.com/tonge/p/4891289.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!