小编use*_*371的帖子

更改类名会影响Java反序列化吗?

我正在进行修改和一个单独的应用程序,允许保存特定游戏的重播。

我必须序列化和反序列化的是两个 ContO 类数组、Plane 类数组、Trackers 和 Medium 类数组,这没问题。

为了扩展此功能,我决定在单独的应用程序中重建它,以便它支持所述游戏的 2 个版本。我计划执行此操作的方法是使用名为 Medium、ContO、Plane 和 Trackers 的抽象类,并且扩展这些类的类将被命名为 MediumVersion1 和 MediumVersion2、ContOVersion1 等。

在原始游戏文件中,两个版本的类都被命名为 ContO、Plane、Trackers 和 Medium,我想知道的是:通过更改类的名称来反映将要反序列化的文件的版本,是否会影响反序列化过程?

例如,我在原始游戏文件中将该类序列化为 ContO 名称,但将其反序列化为名为 ContOVersion1 的新类名,但包含完全相同的变量。

java serialization classname deserialization

5
推荐指数
1
解决办法
1823
查看次数

在x86_64汇编中调用约定差异

所以,我有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)

assembly x86-64 masm calling-convention

1
推荐指数
1
解决办法
276
查看次数