zoukankan      html  css  js  c++  java
  • 对象复制(所谓的克隆Clone)

    对象复制,最generic的方法,估计是继承ICloneable,然后写Clone函数。

    但当该函数不能修改,如是第三方组件中的类,或者因为其它原因,我们就被迫采取别的方法了。

    如果碰巧对象实现了ISerializable,那么我们可以:


            
    private static void TestClone()
            
    {
                Person p1 
    = new Person();
                p1.Age 
    = 26;
                p1.UserName 
    = "灵感之源";

                Person p2 
    = (Person)CloneObjectEx(p1);
                p2.UserName 
    = "unruledboy";

                Console.WriteLine(p1.UserName);
                Console.WriteLine(p2.UserName);
            }


            
    public static Person CloneObject(Person ObjectInstance)
            
    {
                BinaryFormatter bFormatter 
    = new BinaryFormatter();
                MemoryStream stream 
    = new MemoryStream();
                bFormatter.Serialize(stream, ObjectInstance);
                stream.Seek(
    0, SeekOrigin.Begin);
                Person newObject 
    = (Person)bFormatter.Deserialize(stream);
                
    return newObject;
            }


            
    public static object CloneObjectEx(object ObjectInstance)
            
    {
                BinaryFormatter bFormatter 
    = new BinaryFormatter();
                MemoryStream stream 
    = new MemoryStream();
                bFormatter.Serialize(stream, ObjectInstance);
                stream.Seek(
    0, SeekOrigin.Begin);
                
    return bFormatter.Deserialize(stream);
            }

        [Serializable]
        
    public class Person
        
    {
            
    private int age;
            
    private string userName;

            
    public Person()
            
    {
            }


            
    public int Age
            
    {
                
    get{return age;}
                
    set{age = value;}
            }

            
    public string UserName
            
    {
                
    get{return userName;}
                
    set{userName = value;}
            }

        }

    CloneObject和CloneObjectEx的区别在于:CloneObject返回的是强类型,但限制为指定的类型,不通用;后者通用,但性能要更加低。


    或者显式采用反射来逐个获取对象的每个属性:
    Base class for cloning an object in C# 


    如果对象连ISerializable都没有实现,那么我们只能:
    How to serialize an object which is NOT marked as 'Serializable' using a surrogate


    如果上述的方法都不满意,请你研究得出结果之后告诉我;)
  • 相关阅读:
    IDE IntelliJ IDEA ToolsTable 窗口找回
    Equals方法与“==”区别
    JAVA虚拟机内存分配与回收机制(转)
    java集合框架总结三--Set接口及其子类
    2014年4月5日 java集合框架总结2--List接口及其子类
    java集合框架总结一
    sql 操作数据库
    EF框架用中使用mysql数据库需要安装mysql-for-visualstudio
    mysql 服务启动不了;无法启动MYSQL服务”1067 进程意外终止”解决办法
    mysql 修改密码
  • 原文地址:https://www.cnblogs.com/unruledboy/p/226258.html
Copyright © 2011-2022 走看看