2016-08-25 2 views
1

Мне нужно упорствовать десериализуются объект йоты Доктрины в команде Symfony2:Упорно сериализация объект

/* create object */ 
$e = new Event(); 
$u = $em->getRepository('TestWebBundle:User')->findOneByUsername('test_user'); 
$e->setUser($u); 
$e->setCompany($u->getCompany()); 
$e->setType(Event::TYPE_COMPANY); 
$e->setTime(new \DateTime()); 
/* serialize */ 
$es = serialize($e); 
/* unserialize */ 
$esu = unserialize($es); 
/* try to store in db */ 
$em->persist($esu); // error appears here 
$em->flush(); 

в $ ЕСТ EntityManager, все работает правильно, в том числе сериализации (я думаю), но сообщение появляется

[Symfony\Component\Debug\Exception\ContextErrorException] 
Warning: in_array() expects parameter 2 to be array, null given 

и сам объект не сохраняет. Если я попытаюсь сохранить $ e, он работает правильно. Любая идея, что не так?

+0

возможно, потеря ссылки с связанным с ней объектом (пользователем и компанией) попробуйте обновить их – Matteo

+0

возможно эта ссылка http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/entities- in-session.html # serializing-entity-in-the-session может вам помочь. – yceruto

+0

Код: echo $ e-> getUser(); echo $ e-> getCompany(); echo $ esu-> getUser(); echo $ esu-> getCompany(); дает test_user_name COMP_NAME test_user_name [Symfony \ Component \ Debug \ Exception \ ContextErrorException] Catchable Фатальная ошибка: Метод Доверенные \ __ CG __ \ TCOM \ TestWebBundle \ Entity \ Company :: __ ToString() должен возвращать строковое значение класса компании есть __toString, поэтому я попытаюсь «реализовать __sleep()» – cb1986ster

ответ

-1

Я решил проблему реализации моей собственной сериализации и десериализации:

function cserialize($o,$raw=false){ 
    static $fn=__FUNCTION__; 
    $otype = strtolower(gettype($o)); 
    // Simple types 
    if(in_array($otype,array('null','boolean','integer','float','string','double'))){ 
    $r = array(
     'type'=>'raw', 
     'value'=>$o 
    ); 
    if($raw)return $r; 
    return serialize($r); 
    } 
    // 
    if($otype == 'object'){ 
    $oclass = get_class($o); 
    } else { 
    $oclass = null; 
    } 
    // Arrays 
    if(is_array($o) || $oclass == 'Doctrine\Common\Collections\ArrayCollection'){ 
    $t = array(); 
    foreach ($o as $element) 
     $t[] = $fn($element,true); 
    $r = array(
     'type'=>'array', 
     'value'=>$t 
    ); 
    if($raw)return $r; 
    return serialize($r); 
    } 
    // Objects 
    if($otype == 'object'){ 
    $isEntity = (strpos($oclass, '\\Entity\\') !== false); 
    if($isEntity && $o->getId()!==null){ 
     // Entity whit id - keep just id 
     $repository = explode('\\Entity\\',$oclass); 
     $repository[0] = implode('',explode('\\',$repository[0])); 
     $repository[1] = implode('',explode('\\',$repository[1])); 
     $repository = implode(':',$repository); 
     $repository = str_replace('Proxies__CG__','',$repository); 
     $r = array(
     'type'=>'entity-stored', 
     'repository'=>$repository, 
     'id'=>$o->getId() 
    ); 
     if($raw)return $r; 
     return serialize($r); 
    } 
    if(!$isEntity){ 
     // Some kind of object - use normal serialization 
     $r = array(
     'type'=>'raw', 
     'value'=>$o 
    ); 
     if($raw)return $r; 
     return serialize($r); 
    } else { 
     $t = array(); 
     foreach (get_class_methods($o) as $method) { 
      if(strncmp('get',$method,3)!=0 || 
      $method == 'getAsFlatArray' || 
      $method == 'getId' 
     ) 
      continue; 
      $val = $o->$method(); 
      $name = 'set'.substr($method,3); 
      if($val !== null) 
      $t[$name] = $fn($val,true); 
     } 
     $r = array(
     'type'=>'entity-new', 
     'class'=>$oclass, 
     'value'=>$t 
    ); 
     if($raw)return $r; 
     return serialize($r); 
    } 
    } 
    throw new Exception("Error in serializer", 1); 
} 
function cunserialize($o,$em,$raw=false){ 
    static $fn = __FUNCTION__; 
    if(!$raw)$o=unserialize($o); 
    switch ($o['type']) { 
    case 'array': 
     $t=array(); 
     foreach ($o['value'] as $element) 
     $t[] = cunserialize($element,$em,$raw); 
     return $t; 
    case 'entity-new': 
     $class = '\\'.$o['class']; 
     $r = new $class(); 
     foreach ($o['value'] as $method => $value) 
     $r->$method($fn($value,$em,true)); 
     return $r; 
    case 'entity-stored': 
     return $em->getRepository($o['repository'])->findOneById($o['id']); 
    case 'raw'; 
     return $o['value']; 
    default: 
     throw new Exception("Error in unserializer", 1); 

    } 
} 

Так что теперь я могу назвать:

$es = cserialize($e); 
$esu = cunserialize($es,$em); 

Проблема заключается во сне и пробуждении свойств.

Смежные вопросы