学习完基础的背包系统,发现一个问题。背包里强化装备或者升级装备时,同名装备的属性也会发生变动。
这个问题一度让我十分苦恼,网上也找不到原因。
后来发现初始化背包时,实例化的同名物品指向的地址相同,也就是说所有同名装备都是一个物体,对任意一个装备进行操作都会改变这个装备的同名装备。
解决办法:
序列化克隆每一个装备对象,使他们指向不同地址。
步骤:
第一,在装备类前加上[System.Serializable],使其可序列化
[System.Serializable] //表示该类可以序列化的意思
public class Iventory()
{
}
第二,装备类对象序列化
//必要的引用
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class Main()
{
private arraylist<iventory> list = new arraylist<iventory>();
private Iventory item = new Iventory();
void xuliehua()
{
/*序列化前:id = 1001
item和it是引用类型,地址相同,改变item,it也会跟着改变*/
item = list[1];
Iventory it = list[1];
var a = item;
//序列化,item的地址指向新的托管堆,对item进行操作
item = DeepClone(a) as Iventory;
item.id = 1003;
/*序列化后item.id = 1003 it.id = 1001
对item进行操作,it的值并不会改变*/
}
//序列化函数
public static object DeepClone(object obj)
{
BinaryFormatter bFormatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bFormatter.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
return bFormatter.Deserialize(stream);
}
}
克隆对象之后,每件装备指向不同地址,操作一个不会影响其他。