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

 

代码如下:具体看注释

   [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#深复制和浅复制)