zoukankan      html  css  js  c++  java
  • 架构应该解决好对象的克隆问题

    克隆的问题是程序开发中遇到的很基础的问题,一旦涉及,就会占用开发人员很多精力。应该在架构中统一解决

    IClone 接口有坑。但有的实现还依赖它。所以去除还是去除不掉。 但可以自行实现去除这个依赖。

    系统应该提供三个函数:

      DeepClone<T>(this T obj) where T: class

      ShallowClone<T>(this T obj) where T: class

      CopyTo<T>(object source, T toEntity)

    DeepClone 是深克隆。使用 MemoryStream + BinaryFormatter ,这种方式依赖: Serializable  特性,但是性能较快。可以检测。

    ShallowClone 是浅克隆。使用反射调用: MemberwiseClone 方式, 不明白为什么 MemberwiseClone 是 protected 的,而不是 public 的。

    CopyTo 是按字段值使用反射方式进行复制。

    当反射成为唯一的方式的时候,也就无从选择了。还好 .Net 有 Emit ,可以用在基础库实现中(开发成本大,但一次投入,重复利用)。

    1. 系统要提供深克隆,浅克隆两种方式,去除 IClone 接口。

    IClone接口有很多问题, 如基类实现了克隆接口后, 子类不实现就有问题: http://www.cnblogs.com/newsea/archive/2012/09/07/2674425.html

    2. 基类拷贝构造函数

    如: 

    public  class  生物
    {
        pubic  string Type { get; set; }
        public  int Height { get; set ; }
    }
    
    public class 人:生物
    {
        public  string Sex { get; set; }
    }
    
    public class 花:生物
    {
        public string Color { get; set; }
    }
    
    生物 sw = FindOne();
    if( sw.Type == "") {
        var ren = new 人( sw) ;
    }
    else {
        var hua = new 花(sw ) ;
    }

    而这个基类拷贝构造函数的功能,应该由系统提供,而不是每个类写一个。 实现浅克隆就可以。 利用之前的 CopyTo 方法

    var ren = new 人();

    ren = sw.CopyTo(ren);

    var hua = new 花();

    hua = sw.CopyTo(hua);

    3. 深克隆归根到底,就是序列化。

    只有能序列化的克隆,才是深克隆。深克隆要选择性能最好的序列化方式。

    没有序列化的架构机制,就是耍流氓。

    4. 克隆和序列化要解决相到引用的问题

    类A引用类B,类B引用类A。

    可以检测,当相互引用,自动断掉。

  • 相关阅读:
    asynDBCenter(修改)
    asynDBcenter(复习)
    随笔
    mongo二维数组操作
    function复习
    Java源码更改的方式
    Struts has detected an unhandled exception
    创建template模板
    aused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method fai
    node to traverse cannot be null
  • 原文地址:https://www.cnblogs.com/newsea/p/5526707.html
Copyright © 2011-2022 走看看