• 深拷贝浅拷贝[对象序列化]


    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 深拷贝浅拷贝_对象序列化_
    {
        class Program
        {
            static void Main(string[] args)
            {
                #region 深浅拷贝原理
                ////拷贝:数据的复制
                ////Person p1 = new Person() { Age = 19, Name = "soso", Sex = "男", MyCar = new Car() { Color = "Green" } };
                //////浅拷贝:
                ////Person p2 = new Person();
                ////p2.Age = 23;
                ////p2.Name = "jk";
                ////p2.Sex = "女";
                ////p2.MyCar = p1.MyCar;
                ////Car c1 = p1.MyCar;
                ////Car c2 = p2.MyCar;
    
                ////深拷贝
                //Person p1 = new Person();
                //p1.Age = 13;
                //p1.MyCar = new Car() { Color = "Black" };
                //Person p2 = new Person();
                //p2.Age = p1.Age;
                //p2.MyCar = new Car() { Color = "Black" };
                //p2.MyCar = new Car() { Color = p1.MyCar.Color };
                ////p2.MyCar = new Car() { Color = "Black" };
                ////            &c1
                ////0x0694e990
                ////    c1: 0x027f1378
                ////&c2
                ////0x0694e98c
                ////    c2: 0x027f13a4
                //Car c1 = p1.MyCar;
                //Car c2 = p2.MyCar;
                ////p2.MyCar = new Car() { Color = p1.MyCar.Color };
                ////            &c1
                ////0x0641ec70
                ////    c1: 0x0214b378
                ////&c2
                ////0x0641ec6c
                ////    c2: 0x0214b3a4 
                #endregion
    
                //编程实现深拷贝和浅拷贝
                //浅拷贝
                //Copy copy1 = new Copy();
                //copy1.State = "Shallow";
                //copy1.Per = new Person() { Age = 19, MyCar = new Car() { Color = "Blue" } };
                //Copy copy2 = copy1.ShallowCopy();
                //Person per1 = copy1.Per;
                //Person per2 = copy2.Per;
                //Console.WriteLine(copy1.Per.Age + "|" + copy1.Per.MyCar.Color + "|" + copy1.State);
                //Console.WriteLine(copy2.Per.Age + "|" + copy2.Per.MyCar.Color + "|" + copy2.State);
                /*
                 * 19|Blue|Shallow
                 * 19|Blue|Shallow
    &per1
    0x0648ea70
        per1: 0x02569388
    &per2
    0x0648ea6c
        per2: 0x02569388
                 * 
                 */
                //深拷贝1,
                //Copy copy11 = new Copy() { Per = new Person() { Name = "DeepCopy", MyCar = new Car() { Color = "DarkBlack" } } };
                //copy11.State = "Deep";
                //Copy copy22 = copy11.DeepCopy1(copy11);
                //Console.WriteLine(copy11.State + "|" + copy11.Per.Name + "|" + copy11.Per.MyCar.Color);
                //Console.WriteLine(copy22.State + "|" + copy22.Per.Name + "|" + copy22.Per.MyCar.Color);
                //Car c1 = copy11.Per.MyCar;
                //Car c2 = copy22.Per.MyCar;
                /*
                 * Deep|DeepCopy|DarkBlack
                 * Deep|DeepCopy|DarkBlack
    &c1
    0x0584e8f0
        c1: 0x022d13d8
    &c2
    0x0584e8ec
        c2: 0x022d1414
                 * 
                 */
                //深拷贝2.
                Copy cp = new Copy();
                cp.State = "Deep2";
                cp.Per = new Person() { Age = 19 };
                cp.Per.MyCar = new Car() { Price = 1900 };
                Copy cp2 = cp.DeepCopy();
                Console.WriteLine(cp.State + "|" + cp.Per.Age + "|" + cp.Per.MyCar.Price);
                Console.WriteLine(cp2.State + "|" + cp2.Per.Age + "|" + cp2.Per.MyCar.Price);
                Person pp = cp.Per;
                Person ppp = cp2.Per;
                /*
                 Deep2|19|1900
                 Deep2|19|1900
    &pp
    0x0598ed00
        pp: 0x024cb380
    &ppp
    0x0598ecfc
        ppp: 0x024d0acc       
                 */
                Console.ReadKey();
            }
        }
    
        [Serializable]
        class Copy
        {
            private string state;
    
            public string State
            {
                get { return state; }
                set { state = value; }
            }
    
            private Person per;
    
            public Person Per
            {
                get { return per; }
                set { per = value; }
            }
    
            public Copy ShallowCopy()
            {
                return (Copy)this.MemberwiseClone();
            }
            /// <summary>
            /// 实现这个方法要加序列化标记
            /// </summary>
            public Copy DeepCopy()
            {
                BinaryFormatter bf = new BinaryFormatter();
                using (MemoryStream ms = new MemoryStream())
                {
                    //程序集“深拷贝浅拷贝[对象序列化], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“深拷贝浅拷贝_对象序列化_.Copy”未标记为可序列化。
                    //程序集“深拷贝浅拷贝[对象序列化], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“深拷贝浅拷贝_对象序列化_.Person”未标记为可序列化。
                    //程序集“深拷贝浅拷贝[对象序列化], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“深拷贝浅拷贝_对象序列化_.Car”未标记为可序列化。
                    bf.Serialize(ms, this);
                    ms.Position = 0;
                    return (Copy)bf.Deserialize(ms);
                }
            }
    
            internal Copy DeepCopy1(Copy copy)
            {
                //Copy c = (Copy)this.MemberwiseClone();
                Copy c = copy.ShallowCopy();
                c.Per = new Person() { MyCar = new Car() { Color = c.per.MyCar.Color }, Name = c.per.Name };
                return c;
            }
        }
        [Serializable]
        class Person
        {
            private Car myCar;
    
            public Car MyCar
            {
                get { return myCar; }
                set { myCar = value; }
            }
    
            /// <summary>
            /// 年龄
            /// </summary>
            private int age;
            /// <summary>
            /// 年龄
            /// </summary>
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
            /// <summary>
            /// 名字
            /// </summary>
            private string name;
            /// <summary>
            /// 名字
            /// </summary>
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            /// <summary>
            /// 性别
            /// </summary>
            private string sex;
            /// <summary>
            /// 性别
            /// </summary>
            public string Sex
            {
                get { return sex; }
                set { sex = value; }
            }
        }
        [Serializable]
        class Car
        {
            /// <summary>
            /// 车名
            /// </summary>
            private string name;
            /// <summary>
            /// 车名
            /// </summary>
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            /// <summary>
            /// 颜色
            /// </summary>
            private string color;
            /// <summary>
            /// 颜色
            /// </summary>
            public string Color
            {
                get { return color; }
                set { color = value; }
            }
            /// <summary>
            /// 价格
            /// </summary>
            private int price;
            /// <summary>
            /// 价格
            /// </summary>
            public int Price
            {
                get { return price; }
                set { price = value; }
            }
        }
    }
  • 相关阅读:
    JavaScript异步编程1——Promise的初步使用
    Pailler
    ElGamal
    RSA
    密码基础
    博客园中:为文章添加版权保护
    DCT实现水印嵌入与提取(带攻击)
    量子:基于EPR块对的两步量子直接通信
    量子:拜占庭协议和测谎问题的量子协议的实验证明
    liunx:网络命令
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/3521747.html
Copyright © 2020-2023  润新知