四种深拷贝方法

2018-12-11  本文已影响0人  博博博zhU

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;

    }

}

四种方式  

上一篇 下一篇

猜你喜欢

热点阅读