zoukankan      html  css  js  c++  java
  • 使用序列化和反序列化机制深度复制对象

    由于值类型和引用类型在赋值上的不同。在Clone一个对象的引用类型的成员时,一般只是简单的赋值对对象的引用。此时原有的对象和新赋值的对象会同时引用同一个成员对象。这种对象Clone的方法一般称为浅赋值或浅表复制。在大多数情况下浅赋值并不是我们希望的Clone方式。

    为了实现深度复制,我们就必须遍历有相互引用的对象构成的图,并需要处理其中的循环引用结构。这无疑是十分复杂的。幸好借助.Net的序列化和反序列化机制,可以十分简单的深度Clone一个对象。原理很简单,首先将对象序列化到内存流中,此时对象和对象引用的所用对象的状态都被保存到内存中。.Net的序列化机制会自动处理循环引用的情况。然后将内存流中的状态信息反序列化到一个新的对象中。这样一个对象的深度复制就完成了。

    下面是代码:

     1 public static object Clone(object obj)
     2 {
     3     if(!obj.GetType().IsSerializable)
     4     {
     5         throw new ArgumentException("对象不是可序列化的。");
     6     }
     7 
     8     IFormatter format = new BinaryFormatter();
     9     using (Stream stream = new MemoryStream())
    10     {
    11         format.Serialize(stream, obj);
    12         stream.Seek(0, SeekOrigin.Begin);
    13 
    14         return format.Deserialize(stream);
    15     }
    16     
    17 }
  • 相关阅读:
    LeetCode-018-四数之和
    LeetCode-017-电话号码的字母组合
    LeetCode-016-最接近的三数之和
    LeetCode-015-三数之和
    LeetCode-014-最长公共前缀
    LeetCode-013-罗马数字转整数
    LeetCode-012-整数转罗马数字
    LeetCode-011-盛最多水的容器
    LeetCode-010-正则表达式匹配
    [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树Z形遍历
  • 原文地址:https://www.cnblogs.com/hyl8218/p/1635392.html
Copyright © 2011-2022 走看看