我正在进行修改和一个单独的应用程序,允许保存特定游戏的重播。
我必须序列化和反序列化的是两个 ContO 类数组、Plane 类数组、Trackers 和 Medium 类数组,这没问题。
为了扩展此功能,我决定在单独的应用程序中重建它,以便它支持所述游戏的 2 个版本。我计划执行此操作的方法是使用名为 Medium、ContO、Plane 和 Trackers 的抽象类,并且扩展这些类的类将被命名为 MediumVersion1 和 MediumVersion2、ContOVersion1 等。
在原始游戏文件中,两个版本的类都被命名为 ContO、Plane、Trackers 和 Medium,我想知道的是:通过更改类的名称来反映将要反序列化的文件的版本,是否会影响反序列化过程?
例如,我在原始游戏文件中将该类序列化为 ContO 名称,但将其反序列化为名为 ContOVersion1 的新类名,但包含完全相同的变量。
所以,我有3个参数的汇编程序ASM_Method(void*, void*, int)和init_method(float, int*).感兴趣的是前者的无效指针.
当我从C++文件中调用方法时,参数为:
float src[64];
float dest[64];
int radius[3];
init_method(1.5, radius);
ASM_Method(src, dest, 64);
Run Code Online (Sandbox Code Playgroud)
反汇编这个调用过程:
mov r8d,100h
lea rdx,[rbp+0A0h]
lea rcx,[rbp-60h]
call ASM_Method
Run Code Online (Sandbox Code Playgroud)
是否已初始化,程序运行正常.但是,当我这样做时:
float* src = new float[64];
float* dest = new float[64];
int radius[3];
init_method(1.5, radius);
ASM_Method(src, dest, 64);
Run Code Online (Sandbox Code Playgroud)
调用时,RCX设置为非正确地址的值,但RDX是正确的.程序崩溃了.
反汇编这个调用过程:
mov r8d,100h
mov rdx,rbx
mov rcx,rdi
call ASM_Method
Run Code Online (Sandbox Code Playgroud)
除非我将src初始化为某些值,否则RCX在调用时会更改为无效地址(在本例中为1).
ASM_Method的汇编代码:
mov rax, rdx
add rax, r8
shr r8, 4
inc r8
xor r9, r9
movdqu xmm1, [rax]
MainLoop:
movdqu xmm0, [rcx …Run Code Online (Sandbox Code Playgroud)