C#深拷贝

101 阅读1分钟

1、使用MemoryStream流及xml序列化/反序列化,实现深拷贝引用类型变量

    public static T DeepCopyXML<T>(this T obj)
    {
        object retval;
        using (MemoryStream ms = new())
        {
            XmlSerializer xml = new(typeof(T));
            xml.Serialize(ms, obj);
            ms.Seek(0, SeekOrigin.Begin);
            retval = xml.Deserialize(ms);
            ms.Close();
        }
        return (T)retval;
    }

    2、 使用JSON序列化/反序列化

   public static T DeepCopyJson<T>(this T obj)
   {
       string json = JsonSerializer.Serialize(obj);
       return JsonSerializer.Deserialize<T>(json);
   }

 测试代码及结果如下:

   DeepCopy original = new DeepCopy()
   {
       ID = 1,
       Name = "Tom",
       List = new List<string>() { "1", "2", "3" },
   };

   Console.WriteLine("Original: ");
   Console.WriteLine($"ID: {original.ID}");
   Console.WriteLine($"Name: {original.Name}");
   Console.WriteLine($"List: {string.Join(", ", original.List)}");
   Console.WriteLine("-------------------------------------------------");

   //深拷贝
   DeepCopy deepCopyXML  = DeepCopy.DeepCopyXML(original);
   deepCopyXML.ID = 2;
   deepCopyXML.Name = "Jerry";
   deepCopyXML.List[0] = "4";
   Console.WriteLine("XMLCopy: ");
   Console.WriteLine($"ID: {deepCopyXML.ID}");
   Console.WriteLine($"Name: {deepCopyXML.Name}");
   Console.WriteLine($"List: {string.Join(", ", deepCopyXML.List)}");
   Console.WriteLine("-------------------------------------------------");

   DeepCopy deepCopyJson = DeepCopy.DeepCopyJson(original);
   deepCopyJson.ID = 3;
   deepCopyJson.Name = "Jack";
   deepCopyJson.List[0] = "5";
   Console.WriteLine("JsonCopy: ");
   Console.WriteLine($"ID: {deepCopyJson.ID}");
   Console.WriteLine($"Name: {deepCopyJson.Name}");
   Console.WriteLine($"List: {string.Join(", ", deepCopyJson.List)}");
   Console.WriteLine("-------------------------------------------------");

   //原始对象
   Console.WriteLine("Original: ");
   Console.WriteLine($"ID: {original.ID}");
   Console.WriteLine($"Name: {original.Name}");
   Console.WriteLine($"List: {string.Join(", ", original.List)}");
   Console.WriteLine("-------------------------------------------------");