美文网首页
四种深拷贝方法

四种深拷贝方法

作者: 博博博zhU | 来源:发表于2018-12-11 18:43 被阅读0次

using System;

using System.Collections;

using System.Collections.Generic;

using System.IO;

using System.Reflection;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

using System.Xml.Serialization;

using UnityEngine;

public class CopyData : MonoBehaviour {

    //四种深拷贝方法

    public static T DeepCopyByReflect<T>(T obj)

    {

        //如果是字符串或值类型则直接返回

        if (obj is string || obj.GetType().IsValueType) return obj;

        object retval = Activator.CreateInstance(obj.GetType());

        FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

        foreach (FieldInfo field in fields)

        {

            try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }

            catch { }

        }

        return (T)retval;

    }

    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;

    }

    public static T DeepCopyByBin<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;

    }

    //需要silverlight支持

    public static T DeepCopy<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;

    }

}

四种方式  

相关文章

  • 对象深拷贝和浅拷贝

    浅拷贝 深拷贝 深拷贝的递归方法 深拷贝的JSON方法

  • 四种深拷贝方法

    using System; using System.Collections; using System.Coll...

  • 知识点总结(1)

    1.深拷贝与浅拷贝 举例 总结: 只有第一种情况是浅拷贝第四种情况有可能地址相同,但是也是深拷贝深拷贝:拷贝指针和...

  • 对象的深浅拷贝

    浅拷贝 深拷贝 方法1 方法2

  • 深拷贝 浅拷贝

    深入认识深拷贝 浅拷贝 公共方法 // 深拷贝 浅拷贝 对于基本类型来说 对于赋值操作 就是 深拷贝 因为值...

  • JS 中深拷贝的几种实现方法

    JS 中深拷贝的几种实现方法 1、使用递归的方式实现深拷贝 方法二 2、通过 JSON 对象实现深拷贝 缺点 (1...

  • 深拷贝

    深拷贝的方法

  • 不完全深拷贝要实现完全深拷贝

    需求:默认状态下深拷贝指的是不完全深拷贝, 如要实现完全深拷贝, 则要重写copyWithZone: 方法, 自行...

  • copy方法和mutableCopy方法的区别

    copy方法指针拷贝,浅拷贝;mutableCopy方法地址拷贝,深拷贝。 简单操作 特性:互不影响原则 可以看到...

  • 深拷贝与浅拷贝

    本文将讲述一下几点 深拷贝与浅拷贝的区别。 深拷贝的常用方法 切记。只有引用类型才存在深拷贝与浅拷贝的问题哦~,基...

网友评论

      本文标题:四种深拷贝方法

      本文链接:https://www.haomeiwen.com/subject/geiehqtx.html