2016-11-27 13 views
7

私は、sericalize()関数を使用してMySQLデータベースに保存され、その後unserialize()を使用して変換された複雑な構造を持っています。システムをPHP 5.3からPHP 5.6に移行し、5.3でシリアライズされたデータを5.6でシリアライズした後、構造が壊れています。オブジェクトへの参照は、代わりに配列として表示されるようになりました。PHP 5.3からPHP 5.6への移行

私の質問は以下のとおりです。

  1. 異なるPHPバージョンでシリアライズ/デシリアライズによって使用される別のエンコーディングに関する仕様はありますか?

  2. シリアル化されたデータをPHP 5.3エンコーディングからPHP 5.6エンコーディングに変換するにはどうすればよいですか?(Google検索やPHP.netのドキュメントで十分に具体的なものは見つかりませんでした)

+0

こんにちは、 あなたはシリアル化されているものについて詳しく説明できますか?それはクラスなのか、データの配列なのでしょうか? –

+1

オブジェクトを逆シリアル化するときは、クラス定義をコードに含める必要があります。したがって、オブジェクトを格納した場所から通常のコードベースの外側でテストしている場合や、オブジェクト構造を変更した場合は、正しくデシリアライズしません。オブジェクト構造を変更する必要がある場合は、古いオブジェクトを保持し、新しい構造を使用して新しいオブジェクトを再作成して再初期化します。 (私はそれをテストする立場にないので答えとして投稿しませんが、探しているものです) – Robbie

答えて

1

あなたは、(PHP 5.3のインストールを使用して)JSONにシリアライズされたデータを変換し、データベースにそれを保存してから(PHP 5.6のインストールを使用して)oppositを行うことができます。 5.3からJSONへ

:5.6にJSONから

$data = unserialize($strSerializedData); 
$jsonData = json_encode($data); 

$data = json_decode($jsonData); 
$strSerializedData= serialize($data); 

あなたは、元のデータと一致するjson_decodeに送信オプションを調整する必要があるかもしれません。

このオプションは、どのデータがシリアル化されているかによって異なります。データがクラスの場合、これは機能しません。コンストラクタを呼び出さずにオブジェクトのインスタンス化を強制することになります。

5.6.0 Cを交換することにより、シリアル化されたデータを操作:Oと

また、あなたは、問題のドキュメントでこのノート(here)に関連している可能性が今は失敗する。

+0

質問はオブジェクトの直列化/逆シリアル化に関するものであり、 "あなたのデータがクラスであれば、これはうまくいかないだろう」ええ、これはうまくいかないでしょう。クラス内で "toJSON()"メソッドと "fromJSON()"を作成し、それを使って内部にアクセスすることもできますが、これまでに行っていれば、自分でserliaze/deserialize関数を書くこともできます!そしてそれを行うには、 'serializable'インターフェース(http://php.net/manual/en/class.serializable.php) – Robbie

+0

を使用してください。これはクラスにとってはうまくいかないと約束しました。質問には明確化が必要です。 –

+0

私は逐次的に授業の対象となっています。オブジェクトは、同じクラスのオブジェクトへの参照を持ち、他のクラスへの参照も持ちます。これらのクラスの中には、参照するオブジェクトを参照するものもあります。 serialize()を使用すると、これらの相互参照はr:と数字の後に表示されます。これらの参照のいくつかは、PHP 5.6でそれらを直列化解除するときに壊れています。代わりに配列内のクラスオブジェクトでなければなりません。 –

2

はい、PHP5.6ではオブジェクトのシリアライズが変更されました。具体的には、オブジェクトのシリアライゼーションに関連する領域の数はPHP5.6

中にtidedたPHP unserialize manualでこれを言及曖昧音符がある:

Cを置き換えることによってシリアル化されたデータを操作

5.6.0:とO:コンストラクタを呼び出さずにオブジェクトのインスタンス化を強制すると、 は失敗します。

しかし、バグリストを見ると、もう少し詳しくはフードの下にreport 68099となっています。また、元のフォーマットが何の公式ドキュメントを持っていないと述べている:

「元の動作は、(我々は古いシリアル化形式は、新しい形式を使用して、クラスのため を使用できるようにすること)文書化されていませんでしたも が公式にサポートされています」

この議論の最終結果は、「修正されません」でした。

だから基本的に、あなたのオプションは次のとおりです。

  • は、PHPのバージョン間でデータをエクスポートする方法として、他のシリアライザのいずれかを試してみてください。オブジェクトを扱うこともできるsession_encodeなど。

  • 変換スクリプト。現在の書式PHP internalsには、 という広範に文書化されたバージョンがあります。これは、構文を更新するために古い書式の イテレータとともに使用できます。

関連する問題