2

unserializeオブジェクトのインスタンス状態を保存しようとしていますが、 「オフセットエラー」エラーserializedのためにオブジェクトを再開できません。

これは、最も単純なオブジェクトであっても、シリアル化を解除しようとするすべてのオブジェクトに当てはまります。

class Object
{
    protected $variable = true;
}

$object = serialize(new Object());
$string = 'O:6:"Object":1:{s:11:"*variable";b:1;}';

echo $object."\n";
echo "length: ". strlen($object)."\n\n";
echo $string . "\n"; // Strangely 2 characters shorter than $object
echo "length: ". strlen($string)."\n";

unserialize($object); // Works
unserialize($string); // Does not work

このコードは以下を出力します:

O:6:"Object":1:{s:11:"*variable";b:1;}
length: 40 

O:6:"Object":1:{s:11:"*variable";b:1;} 
length: 38 

Notice: unserialize(): Error at offset 33 of 38 bytes

私は立ち往生しています、なぜ保存された文字列を逆シリアル化できないのですか?

4

2 に答える 2

1

欠落している2つの文字は、保護された属性に使用されるnullバイトです。あなたはそれらを見ることができませんが、それらはまだそこにあります。したがって、あなた$stringは有効なシリアル化ではありません。

アップデート:

実際には、ヌルバイトはUTF-8エンコーディングで(無効な文字記号を使用して)表示できます。[出力]を選択すると、このデモで確認できます。 Textbox

string(40) "O:6:"Object":1:{s:11:"�*�variable";b:1;}"
于 2013-03-22T16:38:32.470 に答える
1

()は、実際には2つの非表示のnullバイト()で終了し*ます。これは、それをBINARYとして処理する必要があることを意味します(これは、データベースでは、CHAR/TEXT列ではなくBINARY/BLOB列に格納することも意味します)。話の教訓は次のとおりです。PHPはいつでもシリアル化メソッドを変更する権利を留保します。したがって、文字列をシリアル化するためにphpを使用せず、シリアル化された文字列を文字データではなくBINARYとして扱います。"\x2A""\x0\x2A\x0"

于 2013-03-22T16:42:57.183 に答える