Я пытался десериализовать на 32-битном сервере объект, который был сериализован на 64-битном сервере.Я выделил мою проблему целым числом в объекте.Вот небольшое воспроизведение проблемы.
На 64-разрядной машине:
$i = serialize('20110510134021'); //i:20110510134021;
На 32-разрядной машине:
$i = unserialize('i:20110510134021;');
Выдает ошибку
Notice: unserialize(): Error at offset 0 of 16 bytes
Теперь я понимаю, что этот метод сериализации не должен использоваться для межсистемной передачи данных.Однако мы просто пытаемся перенести данные в другую систему, а не активно использовать их для передачи.Это единовременная вещь.
Я думаю, что это может быть связано с целочисленным переполнением, но даже на 32-разрядном сервере я могу сделать что-то вроде
$i = 20110510134021;
echo $i;
отлично работаетЯ предполагаю, что целочисленные типы PHP масштабируются до некоторого двойного типа или чего-то в этом роде.Но почему он этого не делает, когда не десериализуется?
Как я могу десериализовать эти объекты?Если я не могу, есть ли способ преобразовать их во что-то еще?Наконец, кто-нибудь написал метод десериализации в самом PHP?Или есть подробности о протоколе?Я мог бы использовать это и иметь специальный регистр для этих целых чисел.
Спасибо.
Примечание: У меня нет доступа к исходным данным, только сериализованный результат.