PHP7.0で単純なオブジェクトの配列をシリアル化しようとしていますが、何らかの理由で動作しません。ここでは、オブジェクトのvar_dump
」D列は次のとおりです。単純なPHP7.0クラスが正しくシリアル化されていません
array (size=3)
0 =>
object(My\Bundle\Entity\Role)[504]
protected 'id' => int 2
protected 'role' => string 'ROLE_LDAP_CHECKIN_APP_ADMIN' (length=27)
1 =>
object(My\Bundle\Entity\Role)[506]
protected 'id' => int 3
protected 'role' => string 'ROLE_LDAP_CHECKIN_APP_USER' (length=26)
2 =>
object(My\Bundle\Entity\Role)[507]
protected 'id' => int 1
protected 'role' => string 'ROLE_USER' (length=9)
これは、次のシリアル化された文字列を出力します
a:3:{i:0;r:18;i:1;r:22;i:2;r:26;}
私はその文字列をアンシリアライズした場合、私はちょうど次のエラーを取得:
Notice: unserialize(): Error at offset 14 of 33 bytes
を
クラスは、\Serializiable
を実装します。
namespace My\Bundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\Role\RoleInterface;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Role Entity
*
* @ORM\Entity
* @ORM\Table(name="role")
*
*/
class Role implements \Serializable
{
/**
* @ORM\Id
* @ORM\Column(type="integer", name="id")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", name="role", unique=true, length=255)
* @Assert\NotBlank()
*/
protected $role;
/**
* Populate the role field
* @param string $role ROLE_FOO etc
*/
public function __construct($role)
{
$this->role = $role;
}
/**
* Return the id field.
*
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* Set the role field
*
* @param $role
*/
public function setRole($role)
{
$this->role = $role;
}
/**
* Return the role field.
* @return string
*/
public function getRole()
{
return $this->role;
}
/**
* Return the role field.
* @return string
*/
public function __toString()
{
return (string) $this->role;
}
public function serialize()
{
return serialize(array($this->id, $this->role));
}
public function unserialize($serialized)
{
list($this->id, $this->role) = unserialize($serialized);
}
}
クラスがロードされていることを確認できます。
編集:http://www.phpinternalsbook.com/classes_objects/serialization.htmlによると、シリアル化された文字列の'r'
エントリは「参照」を表し、そのエントリは配列またはオブジェクト内の他のエントリへの参照/ポインタにすぎないことを意味します。明らかに、18番、22番、26番のエントリへの参照は意味をなさない。これはPHPのバグですか?
チェックするだけで、文字列をどのように格納/取得していますか?文字列はバイナリのヌル文字 '\ 0'を持つことがあります。文字列をコピー/ペーストすると、正しくシリアル化されません。 – Dennis
文字列を' var_dump'で出力しています。文字通り'unserialize(serialize($ array))'を呼び出すだけです。私はバグを分離するためにそれをやっています。 – DIMMSum
それでは、どのようにしてアレイを構築しますか?このオブジェクトの配列は、 'serialize'して、' unserialize'してください。https://3v4l.org/P1CNp – AbraCadaver