在不破坏数据的情况下重命名类 / 类型
你可能已经熟悉 Unity 的 [FormerlySerializedAs("oldName")] 特性,它可以在字段声明中使用,在重命名时保留原有的序列化数值。不过它只适用于字段,而不适用于类或类型。
通常,当 类或类型被重命名时,序列化系统会 重置 我们的序列化数据,因为它无法再找到承载该数据结构的类型。这同样适用于把脚本移动到 不同的程序集定义中的情况。
不过,多亏了 Odin 的序列化系统,只要稍加注意和处理,实际上是可以安全地进行重命名的。
要重命名类或类型,可以使用 BindTypeNameToType 特性,指定旧的类型名称以及新的类型。
[assembly: BindTypeNameToType("MyOldNamespace.MyOldTypeName", typeof(MyNewNamespace.MyNewTypeName))]
namespace MyNewNamespace
{
public class MyNewTypeName
{
...
}
}
旧类型名称的参数使用字符串形式,因为显然旧的类型已经被重命名,不再以 Type 对象的形式存在。同时,字符串中也需要包含完整的命名空间路径。
第二个参数则使用新的 Type 对象来指定。
警告
务必在重命名类型并进行编译之前就添加 BindTypeNameToType。一旦数据已经被重置,再去绑定类型名称就为时已晚了。