0

シリアル化された配列(serialize($ array)を実行して作成された)を含むファイル「serialized.txt」があります。

s:133:"a:7:{i:0;i:640;i:1;i:480;i:2;i:2;i:3;s:24:"width="640" height="480"";s:4:"bits";i:8;s:8:"channels";i:3;s:4:"mime";s:10:"image/jpeg";}";

私が行うコンテンツを取得するには:

$string = file_get_contents("serialized.txt");

それから私は:

print_r(unserialize($string));

私が得る出力:

a:7:{i:0;i:640;i:1;i:480;i:2;i:2;i:3;s:24:"width="640" height="480"";s:4:"bits";i:8;s:8:"channels";i:3;s:4:"mime";s:10:"image/jpeg";}

これは、シリアル化されていない配列を出力する必要がある場合の文字列 (ファイルの内容) のシリアル化されていないバージョンです。文字列をコピーして次の操作を行う場合:

print_r(unserialize('a:7:{i:0;i:640;i:1;i:480;i:2;i:2;i:3;s:24:"width="640" height="480"";s:4:"bits";i:8;s:8:"channels";i:3;s:4:"mime";s:10:"image/jpeg";}'));

正しい出力が得られます:

Array
(
    [0] => 640
    [1] => 480
    [2] => 2
    [3] => width="640" height="480"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

そのため、ファイルからプルするときに、問題はシリアル化された配列に分離されているようです。

unserialize docsによると、問題がある場合、関数はfalseを返す必要があります。文字列の内容ではありません。

シリアル化されたデータはgetimagesizeから取得され、別の配列をシリアル化してファイルに配置すると、次のことが確認されました。

serialize(array("hi"));

出力を正常に生成できます。

Array
(
    [0] => hi
)

なぜこれが起こっているのでしょうか?getimagesize 配列に関連するシリアライゼーション プロセスのバグ、またはコピー アンド ペーストによって削除されるファイル内の「隠し」文字の可能性はありますか? 何百万ものこれらのファイルが既に生成されているため、保存方法を変更することはできません。解決策は、配列をシリアル化するために独自のパーサーを作成することだけかもしれませんか? 入力は常に同じ形式なのでもっともらしいですが、これはバグまたはどこかでのエラーであることを知りたいです。

4

1 に答える 1

3

私が見る限り、あなたのデータは二重にシリアル化されているので、次のコードはあなたの配列を出力するはずです:

$string = file_get_contents("serialized.txt");
print_r(unserialize(unserialize($string)));

あなたはあなたがファイルに保存する方法について考える必要がありますが。1つのシリアル化を削除することをお勧めします。

それはあなたの問題を解決しますか?

于 2012-11-14T22:16:06.767 に答える