2016-08-10 5 views
0

オブジェクトを直列化しましたが、逆シリアル化の後にオブジェクトが空であり、私が間違っていることを理解できません。Unserialize()空のオブジェクトを返します

これは私のコードです:

class Foo implements \Serializable { 

    public $default = 10; 
    public $setMe; 
    public $removeOnSerialize = 'blah'; 

    public function serialize() 
    { 
     unset($this->removeOnSerialze); 
     return serialize($this); 
    } 

    public function unserialzie($serialized) 
    { 
     $unserialized = unserialize(); 
     $unserialize->removeOnSerialize = 'Set some value'; 
     return $unserialized; 
    } 

} 

$obj = new Foo(); 
$obj->setMe = 9999; 

print_r($obj) // here I have all as exepcted 

$serialized = serialize($obj); 

$unserialized = unserialize($serialized); 

print_r($unserialized); 

//object properties after deserialization 
$unserialized->default === 10 // correct 
$unserialized->removeOnSerialize === 'Set some value' //correct 
$unserialized->setMe === NULL // wrong, it should be 9999 

あなたが逆シリアル化後に見るように 'setMe' プロパティは空です。 しかし、 'default'と 'removeOnSerialize'が渡されました。

アイデア?

よろしく、それはすでにあなたがunserialize方法から何かを返すべきではありませんコメント欄で述べたように

+1

いくつかの問題を行うことができます: 'リターンにserialize($ this)を;'あなたがこれを行うことによって、クラス全体をシリアル化しています。 '$ unserialized = unserialize();'は、unserializeするためにパラメータを渡す必要があります。どのように動作するかについては、[ここ](http://php.net/unserialize)を見てください。 – Andrew

+0

メソッド名を確認してください。 'unserialzie'があり、' unserialize'があるはずです。コピー/貼り付け後にコードが機能していない - エラーと警告に従ってください - 彼らがあなたを案内します。 – zajonc

答えて

2

。オブジェクトの値を設定する必要があります。 serializeメソッドの同じクラスのインスタンスでserializeを呼び出してスタックオーバーフローを取得することもできます。 私はあなたがこのようにそれを行うことができますね:カスタム直列で

class Foo implements \Serializable 
{ 
    public $default = 10; 
    public $setMe; 
    public $removeOnSerialize = 'blah'; 

    public function serialize() 
    { 
     unset($this->removeOnSerialze); 
     return serialize($this->getData()); 
    } 

    public function unserialize($serialized) 
    { 
     foreach (unserialize($serialized) as $key => $value) { 
      $this->$key = $value; 
     } 
     $this->removeOnSerialize = 'Set some value'; 
    } 

    protected function getData() 
    { 
     return get_object_vars($this); 
    } 
} 
+0

私は最初の試みでそれを行いました。継承されたオブジェクトでいくつかのプロパティが失われたので、オブジェクト全体を直列化するほうがよいかもしれないと思っていました。 –

0

、それはあなたが変更される可能性が何をserialize()に保存したいとunserialize()

から値を解析する責任提供するために、あなたの責任となりあなたのserializeに:

public function serialize(){ 
    $toSave = ['setMe'=>$this->setMe]; 
    return serialize($toSave); 
} 

この方法で、removeOnSerializeが保存されません。 unserializeにあなたはここに

public function unserialize($data){ 
    $data = unserialize($data); 
    $this->setMe = $data['setMe']; 
    $this->removeOnSerialize = 'Set some value'; 
} 

Live demo

関連する問題