Several problems encountered in C# deep copy

1. Binary

/// <summary>
    /// 二进制序列化深拷贝
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static T DeepCopyByBinary<T>(T obj)
    {
    
    
        object retval;
        using (MemoryStream ms = new MemoryStream())
        {
    
    
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, obj);
            ms.Seek(0, SeekOrigin.Begin);
            retval = bf.Deserialize(ms);
            ms.Close();
        }
        return (T)retval;
    }

If a variable defined by unity appears in the class that needs to be deep copied, an error will be reported. You need to encapsulate it yourself, such as the Vector3 type.

2、xml

/// <summary>
    /// xml深拷贝
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static T DeepCopyByXml<T>(T obj)
    {
    
    
        object retval;
        using (MemoryStream ms = new MemoryStream())
        {
    
    
            XmlSerializer xml = new XmlSerializer(typeof(T));
            xml.Serialize(ms, obj);
            ms.Seek(0, SeekOrigin.Begin);
            retval = xml.Deserialize(ms);
            ms.Close();
        }
        return (T)retval;
    }

The class cannot appear in the class that needs deep copy, otherwise the copy will fail.

3、datacontract

/// <summary>
    /// datacontract深拷贝
    /// 防止引用类型直接赋值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static T DeepCopyByDataContract<T>(T obj)
    {
    
    
        object retval;
        using (MemoryStream ms = new MemoryStream())
        {
    
    
            DataContractSerializer ser = new DataContractSerializer(typeof(T));
            ser.WriteObject(ms, obj);
            ms.Seek(0, SeekOrigin.Begin);
            retval = ser.ReadObject(ms);
            ms.Close();
        }
        return (T)retval;
    }

Not found yet, will be added later.

Guess you like

Origin blog.csdn.net/weixin_47819574/article/details/134370905