UH4L14——序列化库
UH4L14——序列化库
本章代码关键字
1 | JsonMapper.RegisterILRuntimeCLRRedirection() //ILRuntime修改的LitJson特有的方法,热更工程如果要使用则必须调用该方法注册,传入appDomain |
ILRuntime中使用序列化库
序列化库在我们开发当中经常会用到,比如之前我们学过的 LitJson、Protobuf
但是这些库都是存在于主工程中的,那么当使用他们序列化反序列化热更工程中的对象时,他们是不能识别的
所以在ILRuntime中使用序列化库,需要对其进行修改
- LitJson库获取:Demo工程中就有修改好的LitJson
- Protobuf库获取:protobuf-net: Protobuf-net for ILRuntime (gitee.com)
注意:改写序列化库时,不能通过Activator
来创建实例
ILRuntime在使用第三方库时,为了能够正常的对热更工程中声明的类对象进行使用
我们往往需要对其进行修改,修改第三方库对于大家来说可能有一定难度
所以首先去ILRuntime的群和社区中去找找有没有别人做好的,如果没有再尝试自己修改
使用改好的LitJson库
假设在热更工程内要对下面的类序列化和反序列化
1 | using System.Collections.Generic; |
-
初始化时注册
LitJson.JsonMapper.RegisterILRuntimeCLRRedirection(appDomain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25private unsafe void InitILRuntime()
{
//注册委托和委托转换器...
//注册跨域继承类
appDomain.RegisterCrossBindingAdaptor(new ILRuntimeAdapter.Lesson11_TestAdapter());
appDomain.RegisterCrossBindingAdaptor(new CoroutineAdapter());
appDomain.RegisterCrossBindingAdaptor(new IAsyncStateMachineClassInheritanceAdaptor());
//初始化LitJson相关内容
LitJson.JsonMapper.RegisterILRuntimeCLRRedirection(appDomain);
//注册值类型
appDomain.RegisterValueTypeBinder(typeof(Vector3), new Vector3Binder());
appDomain.RegisterValueTypeBinder(typeof(Vector2), new Vector2Binder());
appDomain.RegisterValueTypeBinder(typeof(Quaternion), new QuaternionBinder());
//CLR重定向内容,必须要写到CLR绑定之前!!!
System.Type debugType = typeof(Debug);
MethodInfo methodInfo = debugType.GetMethod("Log", new System.Type[] { typeof(object) });
appDomain.RegisterCLRMethodRedirection(methodInfo, MyLog);
//注册 CLR绑定相关信息
ILRuntime.Runtime.Generated.CLRBindings.Initialize(appDomain);
//初始化ILRuntime相关信息(目前只需要告诉ILRuntime主线程的线程ID,主要目的是能够在Unity的Profiler剖析器窗口中分析问题)
appDomain.UnityMainThreadID = Thread.CurrentThread.ManagedThreadId;
} -
正常使用LitJson进行序列化反序列化
-
序列化:JsonMapper.ToJson(对象)
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class ILRuntimeMain
{
public static void Main()
{
Lesson18_Test test = new Lesson18_Test();
test.testI = 99;
test.testStr = "唐老狮";
test.listTest = new List<int>() { 1, 2, 3, 4, 5 };
test.dictTest = new Dictionary<string, int>() { { "1", 2 }, { "2", 88 }, { "3", 77 } };
//序列化Json字符串
string str = JsonMapper.ToJson(test);
Debug.Log(str);
}
} -
反序列化:JsonMapper.ToObject<类型>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class ILRuntimeMain
{
public static void Main()
{
Lesson18_Test test = new Lesson18_Test();
test.testI = 99;
test.testStr = "唐老狮";
test.listTest = new List<int>() { 1, 2, 3, 4, 5 };
test.dictTest = new Dictionary<string, int>() { { "1", 2 }, { "2", 88 }, { "3", 77 } };
//序列化Json字符串
string str = JsonMapper.ToJson(test);
Debug.Log(str);
//反序列化Json字符串
Lesson18_Test test2 = JsonMapper.ToObject<Lesson18_Test>(str);
Debug.Log(test2.testI);
Debug.Log(test2.testStr);
}
}
-
输出:
如何自己改相关库
- 正确创建热更类型的实例(利用之前反射相关的创建方式)
- 获取泛型容器类的真实热更类型
- 序列化子对象
- 重定向泛型方法
去查看LitJson修改后的源码来分析加了哪些内容,JsonMapper
内部对泛型方法的重定向如下:
关于这里的逻辑,建议配合UH4L21——重定向的书写规则观看
1 | public unsafe static void RegisterILRuntimeCLRRedirection(ILRuntime.Runtime.Enviorment.AppDomain appdomain) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!