最新消息
本人的小游戏“指尖游戏集”已经上线啦!!!欢迎各位来体验,希望大家多多提意见哦~
微信公众号:unity学习加油站 领取Unity游戏源码,以及各种学习资料~
前言:
对象拷贝分为浅拷贝和深度拷贝,都是将对象中的所有字段复制到新的副本对象中;浅拷贝对于值类型和引用类型的方式是有区别的,对于引用类型,如果修改副本中的对象,同时源对象也会随之修改,有时这种操作是不符合预期的;但是深度拷贝不会出现这种情况,副本对象和源对象是两个独立的对象;
一,使用二进制的序列化和反序列化实现(在需要序列化的类加上[Serializable])
public T DeepCopy<T>(T obj)
{
using MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream ,obj);
memoryStream.Seek(0, SeekOrigin.Begin);
var t = (T)binaryFormatter.Deserialize(memoryStream);
return t;
}
二,使用序列化和反序列化实现(在需要序列化的类加上[Serializable])
public T DeepCopy2<T>(T obj)
{
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj));
}
public T DeepCopy3<T>(T obj)
{
return JsonUtility.FromJson<T>(JsonUtility.ToJson(obj));
}
三,使用XML序列化和发序列化实现
public T DeepCopy4<T>(T obj)
{
using MemoryStream memoryStream = new MemoryStream();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(memoryStream ,obj);
memoryStream.Seek(0, SeekOrigin.Begin);
return (T)xmlSerializer.Deserialize(memoryStream);
}
四,利用反射(Reflection)实现
public T DeepCopy<T>(T obj)
{
if (obj is string || typeof(T).IsValueType)
{
return obj;
}
var instance = Activator.CreateInstance(obj.GetType());
FieldInfo[] fieldInfos = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (var item in fieldInfos)
{
try
{
item.SetValue(instance, DeepCopy(item.GetValue(obj)));
}
catch (Exception e) { }
}
return (T)instance;
}