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


    如果上述的方法都不满意,请你研究得出结果之后告诉我;)
  • 相关阅读:
    结对编程-马尔科夫链作业成绩
    结对编程-四则运算(挑战出题)成绩及点评
    结对编程-四则运算成绩
    结对编程-四则运算(挑战出题)
    结对编程
    每天进步一点点-第二天卒
    每天进步一点点-深度学习入门-基于Python的理论与实现 (一)
    今天准备更新每天提高一点点系列
    Books
    WPF命令好状态刷新机制
  • 原文地址:https://www.cnblogs.com/unruledboy/p/226258.html
Copyright © 2011-2022 走看看